Setting up the R workspace

library(tidyverse)
── Attaching core tidyverse packages ────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ──────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(rjags)
Loading required package: coda
Linked to JAGS 4.3.2
Loaded modules: basemod,bugs
library(ggplot2)
library(hydroGOF)
Loading required package: zoo

Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

    as.Date, as.Date.numeric
set.seed(1)

Starting with the Copper River Delta (CRD)

RCP 4.5

Design the Model

Read in the data here, which is an output of XX code file

Then separate the data into air and water temperature files

# Air and water temperature data: CR location, 4.5 scenario
CR_Temps <- read.csv("CR_45SNAPForecast_MonCorr.csv", header=TRUE)

# Air temperature variables
CR_AirTemp45 <- CR_Temps %>%
  select(date, Airport, Air_MonthAvg, std, precision, Region)

# Water temperature variables
CR_WaterTemp45 <- CR_Temps %>%
  select(date, BVS, CAB, TIN, SQR, CAN, EYS, TIS, WDD, RHM)


# Set up a string of all the dates
time <- CR_WaterTemp45$date
length(time)
[1] 1164

Setting up the random walk model

dlm_pooled <- "
model{
#### Priors
for(p in 1:np){
x[1,p] ~ dnorm(x_ic, tau_ic) # Initial condition of water temperature
}
tau_obs ~ dgamma(a_obs, r_obs) # Prior on observation error
tau_add ~ dgamma(a_add, r_add) # Prior on process error

#### Fixed Effects
beta ~ dmnorm(mu_beta, tau_beta) # Prior on beta coefficients

for(p in 1:np){
int[p] ~ dnorm(mu_int, tau_int) # Prior on pond-specific intercepts
}

#### Data Model
for(t in 1:n){ # loop over all time steps
for(p in 1:np){
OBS[t,p] ~ dnorm(x[t,p], tau_obs) # Observed water temperature is drawn from latent air temperature with observation uncertainty
}
Xf[t] ~ dnorm(muAirTemp[t], tauAirTemp[t]) # Latent air temperature is drawn from mean and precision of forecasated air temperature
}

#### Process Model
for(t in 2:n){ # loop over all time steps except teh first (we defined ic above)
for(p in 1:np){
mu[t,p] <- x[t-1,p] + int[p] + beta[1] * x[t-1,p] + beta[2] * Xf[t] # Mean water temperature is a function of the previous time step and current air temperature
x[t,p] ~ dnorm(mu[t,p], tau_add) # Latent water temperature is drawn from mean water temperature with process uncertainty
}
}
}
"

Define the data and priors for the model

# Empty list
data <- list()
# Water temperature observations
data$OBS <- dplyr::select(CR_WaterTemp45, -date)
# Number of time steps
data$n <- nrow(data$OBS)
# Number of ponds
data$np <- ncol(data$OBS)
# Initial water temperature mean
data$x_ic <- 0.1
# Initial water temperature precision
data$tau_ic = 0.1
# Prior parameters for observation and process uncertainty
data$a_obs = 1
data$r_obs = 1
data$a_add = 1
data$r_add = 1
# Prior parameters for beta coefficients
data$mu_beta <- c(0, 0)
data$tau_beta <- diag(x = c(0.001, 0.001), nrow = 2, ncol = 2)
# Prior parameters for intercept
data$mu_int <- 0
data$tau_int <- 0.001
# Mean air temperature estimate
data$muAirTemp <- CR_AirTemp45$Air_MonthAvg
# Air temperature precision
data$tauAirTemp <- CR_AirTemp45$precision

Create JAGS model with 3 chains

jm <- jags.model(file = textConnection(dlm_pooled), data = data, n.chains = 3)
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 448
   Unobserved stochastic nodes: 21680
   Total graph size: 46573

Initializing model

Posterior samples of parameters

CRD45_out_params <- coda.samples(model = jm,
                               variable.names = c('beta', 'int',
                                                  'tau_add', 'tau_obs'),
                               n.iter = 50000, thin = 25)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Posterior samples of response variables

CRD45_out_response <- coda.samples(model = jm,
                                 variable.names = c('x', 'OBS'),
                                 n.iter = 100000, thin = 25)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

A couple quick checks here

# plot(CRD45_out_params)
gelman.diag(CRD45_out_params, confidence = 0.99)
Potential scale reduction factors:

        Point est. Upper C.I.
beta[1]          1       1.00
beta[2]          1       1.01
int[1]           1       1.02
int[2]           1       1.01
int[3]           1       1.02
int[4]           1       1.02
int[5]           1       1.02
int[6]           1       1.02
int[7]           1       1.02
int[8]           1       1.02
int[9]           1       1.02
tau_add          1       1.01
tau_obs          1       1.00

Multivariate psrf

1.01

Visualize the output by just looking at the 95% credible interval of the time-series of X’s and compare that to the observed Y’s

Transform the samples back from the log domain to the linear domain

time                               ## adjust to zoom in and out
   [1] "2012-01-01" "2012-02-01" "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01" "2012-07-01" "2012-08-01"
   [9] "2012-09-01" "2012-10-01" "2012-11-01" "2012-12-01" "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01"
  [17] "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01" "2013-10-01" "2013-11-01" "2013-12-01"
  [25] "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01" "2014-05-01" "2014-06-01" "2014-07-01" "2014-08-01"
  [33] "2014-09-01" "2014-10-01" "2014-11-01" "2014-12-01" "2015-01-01" "2015-02-01" "2015-03-01" "2015-04-01"
  [41] "2015-05-01" "2015-06-01" "2015-07-01" "2015-08-01" "2015-09-01" "2015-10-01" "2015-11-01" "2015-12-01"
  [49] "2016-01-01" "2016-02-01" "2016-03-01" "2016-04-01" "2016-05-01" "2016-06-01" "2016-07-01" "2016-08-01"
  [57] "2016-09-01" "2016-10-01" "2016-11-01" "2016-12-01" "2017-01-01" "2017-02-01" "2017-03-01" "2017-04-01"
  [65] "2017-05-01" "2017-06-01" "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01" "2017-11-01" "2017-12-01"
  [73] "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" "2018-05-01" "2018-06-01" "2018-07-01" "2018-08-01"
  [81] "2018-09-01" "2018-10-01" "2018-11-01" "2018-12-01" "2019-01-01" "2019-02-01" "2019-03-01" "2019-04-01"
  [89] "2019-05-01" "2019-06-01" "2019-07-01" "2019-08-01" "2019-09-01" "2019-10-01" "2019-11-01" "2019-12-01"
  [97] "2012-01-01" "2012-02-01" "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01" "2012-07-01" "2012-08-01"
 [105] "2012-09-01" "2012-10-01" "2012-11-01" "2012-12-01" "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01"
 [113] "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01" "2013-10-01" "2013-11-01" "2013-12-01"
 [121] "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01" "2014-05-01" "2014-06-01" "2014-07-01" "2014-08-01"
 [129] "2014-09-01" "2014-10-01" "2014-11-01" "2014-12-01" "2015-01-01" "2015-02-01" "2015-03-01" "2015-04-01"
 [137] "2015-05-01" "2015-06-01" "2015-07-01" "2015-08-01" "2015-09-01" "2015-10-01" "2015-11-01" "2015-12-01"
 [145] "2016-01-01" "2016-02-01" "2016-03-01" "2016-04-01" "2016-05-01" "2016-06-01" "2016-07-01" "2016-08-01"
 [153] "2016-09-01" "2016-10-01" "2016-11-01" "2016-12-01" "2017-01-01" "2017-02-01" "2017-03-01" "2017-04-01"
 [161] "2017-05-01" "2017-06-01" "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01" "2017-11-01" "2017-12-01"
 [169] "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" "2018-05-01" "2018-06-01" "2018-07-01" "2018-08-01"
 [177] "2018-09-01" "2018-10-01" "2018-11-01" "2018-12-01" "2019-01-01" "2019-02-01" "2019-03-01" "2019-04-01"
 [185] "2019-05-01" "2019-06-01" "2019-07-01" "2019-08-01" "2019-09-01" "2019-10-01" "2019-11-01" "2019-12-01"
 [193] "2020-01-01" "2020-02-01" "2020-03-01" "2020-04-01" "2020-05-01" "2020-06-01" "2020-07-01" "2020-08-01"
 [201] "2020-09-01" "2020-10-01" "2020-11-01" "2020-12-01" "2021-01-01" "2021-02-01" "2021-03-01" "2021-04-01"
 [209] "2021-05-01" "2021-06-01" "2021-07-01" "2021-08-01" "2021-09-01" "2021-10-01" "2021-11-01" "2021-12-01"
 [217] "2022-01-01" "2022-02-01" "2022-03-01" "2022-04-01" "2022-05-01" "2022-06-01" "2022-07-01" "2022-08-01"
 [225] "2022-09-01" "2022-10-01" "2022-11-01" "2022-12-01" "2023-01-01" "2023-02-01" "2023-03-01" "2023-04-01"
 [233] "2023-05-01" "2023-06-01" "2023-07-01" "2023-08-01" "2023-09-01" "2023-10-01" "2023-11-01" "2023-12-01"
 [241] "2024-01-01" "2024-02-01" "2024-03-01" "2024-04-01" "2024-05-01" "2024-06-01" "2024-07-01" "2024-08-01"
 [249] "2024-09-01" "2024-10-01" "2024-11-01" "2024-12-01" "2025-01-01" "2025-02-01" "2025-03-01" "2025-04-01"
 [257] "2025-05-01" "2025-06-01" "2025-07-01" "2025-08-01" "2025-09-01" "2025-10-01" "2025-11-01" "2025-12-01"
 [265] "2026-01-01" "2026-02-01" "2026-03-01" "2026-04-01" "2026-05-01" "2026-06-01" "2026-07-01" "2026-08-01"
 [273] "2026-09-01" "2026-10-01" "2026-11-01" "2026-12-01" "2027-01-01" "2027-02-01" "2027-03-01" "2027-04-01"
 [281] "2027-05-01" "2027-06-01" "2027-07-01" "2027-08-01" "2027-09-01" "2027-10-01" "2027-11-01" "2027-12-01"
 [289] "2028-01-01" "2028-02-01" "2028-03-01" "2028-04-01" "2028-05-01" "2028-06-01" "2028-07-01" "2028-08-01"
 [297] "2028-09-01" "2028-10-01" "2028-11-01" "2028-12-01" "2029-01-01" "2029-02-01" "2029-03-01" "2029-04-01"
 [305] "2029-05-01" "2029-06-01" "2029-07-01" "2029-08-01" "2029-09-01" "2029-10-01" "2029-11-01" "2029-12-01"
 [313] "2030-01-01" "2030-02-01" "2030-03-01" "2030-04-01" "2030-05-01" "2030-06-01" "2030-07-01" "2030-08-01"
 [321] "2030-09-01" "2030-10-01" "2030-11-01" "2030-12-01" "2031-01-01" "2031-02-01" "2031-03-01" "2031-04-01"
 [329] "2031-05-01" "2031-06-01" "2031-07-01" "2031-08-01" "2031-09-01" "2031-10-01" "2031-11-01" "2031-12-01"
 [337] "2032-01-01" "2032-02-01" "2032-03-01" "2032-04-01" "2032-05-01" "2032-06-01" "2032-07-01" "2032-08-01"
 [345] "2032-09-01" "2032-10-01" "2032-11-01" "2032-12-01" "2033-01-01" "2033-02-01" "2033-03-01" "2033-04-01"
 [353] "2033-05-01" "2033-06-01" "2033-07-01" "2033-08-01" "2033-09-01" "2033-10-01" "2033-11-01" "2033-12-01"
 [361] "2034-01-01" "2034-02-01" "2034-03-01" "2034-04-01" "2034-05-01" "2034-06-01" "2034-07-01" "2034-08-01"
 [369] "2034-09-01" "2034-10-01" "2034-11-01" "2034-12-01" "2035-01-01" "2035-02-01" "2035-03-01" "2035-04-01"
 [377] "2035-05-01" "2035-06-01" "2035-07-01" "2035-08-01" "2035-09-01" "2035-10-01" "2035-11-01" "2035-12-01"
 [385] "2036-01-01" "2036-02-01" "2036-03-01" "2036-04-01" "2036-05-01" "2036-06-01" "2036-07-01" "2036-08-01"
 [393] "2036-09-01" "2036-10-01" "2036-11-01" "2036-12-01" "2037-01-01" "2037-02-01" "2037-03-01" "2037-04-01"
 [401] "2037-05-01" "2037-06-01" "2037-07-01" "2037-08-01" "2037-09-01" "2037-10-01" "2037-11-01" "2037-12-01"
 [409] "2038-01-01" "2038-02-01" "2038-03-01" "2038-04-01" "2038-05-01" "2038-06-01" "2038-07-01" "2038-08-01"
 [417] "2038-09-01" "2038-10-01" "2038-11-01" "2038-12-01" "2039-01-01" "2039-02-01" "2039-03-01" "2039-04-01"
 [425] "2039-05-01" "2039-06-01" "2039-07-01" "2039-08-01" "2039-09-01" "2039-10-01" "2039-11-01" "2039-12-01"
 [433] "2040-01-01" "2040-02-01" "2040-03-01" "2040-04-01" "2040-05-01" "2040-06-01" "2040-07-01" "2040-08-01"
 [441] "2040-09-01" "2040-10-01" "2040-11-01" "2040-12-01" "2041-01-01" "2041-02-01" "2041-03-01" "2041-04-01"
 [449] "2041-05-01" "2041-06-01" "2041-07-01" "2041-08-01" "2041-09-01" "2041-10-01" "2041-11-01" "2041-12-01"
 [457] "2042-01-01" "2042-02-01" "2042-03-01" "2042-04-01" "2042-05-01" "2042-06-01" "2042-07-01" "2042-08-01"
 [465] "2042-09-01" "2042-10-01" "2042-11-01" "2042-12-01" "2043-01-01" "2043-02-01" "2043-03-01" "2043-04-01"
 [473] "2043-05-01" "2043-06-01" "2043-07-01" "2043-08-01" "2043-09-01" "2043-10-01" "2043-11-01" "2043-12-01"
 [481] "2044-01-01" "2044-02-01" "2044-03-01" "2044-04-01" "2044-05-01" "2044-06-01" "2044-07-01" "2044-08-01"
 [489] "2044-09-01" "2044-10-01" "2044-11-01" "2044-12-01" "2045-01-01" "2045-02-01" "2045-03-01" "2045-04-01"
 [497] "2045-05-01" "2045-06-01" "2045-07-01" "2045-08-01" "2045-09-01" "2045-10-01" "2045-11-01" "2045-12-01"
 [505] "2046-01-01" "2046-02-01" "2046-03-01" "2046-04-01" "2046-05-01" "2046-06-01" "2046-07-01" "2046-08-01"
 [513] "2046-09-01" "2046-10-01" "2046-11-01" "2046-12-01" "2047-01-01" "2047-02-01" "2047-03-01" "2047-04-01"
 [521] "2047-05-01" "2047-06-01" "2047-07-01" "2047-08-01" "2047-09-01" "2047-10-01" "2047-11-01" "2047-12-01"
 [529] "2048-01-01" "2048-02-01" "2048-03-01" "2048-04-01" "2048-05-01" "2048-06-01" "2048-07-01" "2048-08-01"
 [537] "2048-09-01" "2048-10-01" "2048-11-01" "2048-12-01" "2049-01-01" "2049-02-01" "2049-03-01" "2049-04-01"
 [545] "2049-05-01" "2049-06-01" "2049-07-01" "2049-08-01" "2049-09-01" "2049-10-01" "2049-11-01" "2049-12-01"
 [553] "2050-01-01" "2050-02-01" "2050-03-01" "2050-04-01" "2050-05-01" "2050-06-01" "2050-07-01" "2050-08-01"
 [561] "2050-09-01" "2050-10-01" "2050-11-01" "2050-12-01" "2051-01-01" "2051-02-01" "2051-03-01" "2051-04-01"
 [569] "2051-05-01" "2051-06-01" "2051-07-01" "2051-08-01" "2051-09-01" "2051-10-01" "2051-11-01" "2051-12-01"
 [577] "2052-01-01" "2052-02-01" "2052-03-01" "2052-04-01" "2052-05-01" "2052-06-01" "2052-07-01" "2052-08-01"
 [585] "2052-09-01" "2052-10-01" "2052-11-01" "2052-12-01" "2053-01-01" "2053-02-01" "2053-03-01" "2053-04-01"
 [593] "2053-05-01" "2053-06-01" "2053-07-01" "2053-08-01" "2053-09-01" "2053-10-01" "2053-11-01" "2053-12-01"
 [601] "2054-01-01" "2054-02-01" "2054-03-01" "2054-04-01" "2054-05-01" "2054-06-01" "2054-07-01" "2054-08-01"
 [609] "2054-09-01" "2054-10-01" "2054-11-01" "2054-12-01" "2055-01-01" "2055-02-01" "2055-03-01" "2055-04-01"
 [617] "2055-05-01" "2055-06-01" "2055-07-01" "2055-08-01" "2055-09-01" "2055-10-01" "2055-11-01" "2055-12-01"
 [625] "2056-01-01" "2056-02-01" "2056-03-01" "2056-04-01" "2056-05-01" "2056-06-01" "2056-07-01" "2056-08-01"
 [633] "2056-09-01" "2056-10-01" "2056-11-01" "2056-12-01" "2057-01-01" "2057-02-01" "2057-03-01" "2057-04-01"
 [641] "2057-05-01" "2057-06-01" "2057-07-01" "2057-08-01" "2057-09-01" "2057-10-01" "2057-11-01" "2057-12-01"
 [649] "2058-01-01" "2058-02-01" "2058-03-01" "2058-04-01" "2058-05-01" "2058-06-01" "2058-07-01" "2058-08-01"
 [657] "2058-09-01" "2058-10-01" "2058-11-01" "2058-12-01" "2059-01-01" "2059-02-01" "2059-03-01" "2059-04-01"
 [665] "2059-05-01" "2059-06-01" "2059-07-01" "2059-08-01" "2059-09-01" "2059-10-01" "2059-11-01" "2059-12-01"
 [673] "2060-01-01" "2060-02-01" "2060-03-01" "2060-04-01" "2060-05-01" "2060-06-01" "2060-07-01" "2060-08-01"
 [681] "2060-09-01" "2060-10-01" "2060-11-01" "2060-12-01" "2061-01-01" "2061-02-01" "2061-03-01" "2061-04-01"
 [689] "2061-05-01" "2061-06-01" "2061-07-01" "2061-08-01" "2061-09-01" "2061-10-01" "2061-11-01" "2061-12-01"
 [697] "2062-01-01" "2062-02-01" "2062-03-01" "2062-04-01" "2062-05-01" "2062-06-01" "2062-07-01" "2062-08-01"
 [705] "2062-09-01" "2062-10-01" "2062-11-01" "2062-12-01" "2063-01-01" "2063-02-01" "2063-03-01" "2063-04-01"
 [713] "2063-05-01" "2063-06-01" "2063-07-01" "2063-08-01" "2063-09-01" "2063-10-01" "2063-11-01" "2063-12-01"
 [721] "2064-01-01" "2064-02-01" "2064-03-01" "2064-04-01" "2064-05-01" "2064-06-01" "2064-07-01" "2064-08-01"
 [729] "2064-09-01" "2064-10-01" "2064-11-01" "2064-12-01" "2065-01-01" "2065-02-01" "2065-03-01" "2065-04-01"
 [737] "2065-05-01" "2065-06-01" "2065-07-01" "2065-08-01" "2065-09-01" "2065-10-01" "2065-11-01" "2065-12-01"
 [745] "2066-01-01" "2066-02-01" "2066-03-01" "2066-04-01" "2066-05-01" "2066-06-01" "2066-07-01" "2066-08-01"
 [753] "2066-09-01" "2066-10-01" "2066-11-01" "2066-12-01" "2067-01-01" "2067-02-01" "2067-03-01" "2067-04-01"
 [761] "2067-05-01" "2067-06-01" "2067-07-01" "2067-08-01" "2067-09-01" "2067-10-01" "2067-11-01" "2067-12-01"
 [769] "2068-01-01" "2068-02-01" "2068-03-01" "2068-04-01" "2068-05-01" "2068-06-01" "2068-07-01" "2068-08-01"
 [777] "2068-09-01" "2068-10-01" "2068-11-01" "2068-12-01" "2069-01-01" "2069-02-01" "2069-03-01" "2069-04-01"
 [785] "2069-05-01" "2069-06-01" "2069-07-01" "2069-08-01" "2069-09-01" "2069-10-01" "2069-11-01" "2069-12-01"
 [793] "2070-01-01" "2070-02-01" "2070-03-01" "2070-04-01" "2070-05-01" "2070-06-01" "2070-07-01" "2070-08-01"
 [801] "2070-09-01" "2070-10-01" "2070-11-01" "2070-12-01" "2071-01-01" "2071-02-01" "2071-03-01" "2071-04-01"
 [809] "2071-05-01" "2071-06-01" "2071-07-01" "2071-08-01" "2071-09-01" "2071-10-01" "2071-11-01" "2071-12-01"
 [817] "2072-01-01" "2072-02-01" "2072-03-01" "2072-04-01" "2072-05-01" "2072-06-01" "2072-07-01" "2072-08-01"
 [825] "2072-09-01" "2072-10-01" "2072-11-01" "2072-12-01" "2073-01-01" "2073-02-01" "2073-03-01" "2073-04-01"
 [833] "2073-05-01" "2073-06-01" "2073-07-01" "2073-08-01" "2073-09-01" "2073-10-01" "2073-11-01" "2073-12-01"
 [841] "2074-01-01" "2074-02-01" "2074-03-01" "2074-04-01" "2074-05-01" "2074-06-01" "2074-07-01" "2074-08-01"
 [849] "2074-09-01" "2074-10-01" "2074-11-01" "2074-12-01" "2075-01-01" "2075-02-01" "2075-03-01" "2075-04-01"
 [857] "2075-05-01" "2075-06-01" "2075-07-01" "2075-08-01" "2075-09-01" "2075-10-01" "2075-11-01" "2075-12-01"
 [865] "2076-01-01" "2076-02-01" "2076-03-01" "2076-04-01" "2076-05-01" "2076-06-01" "2076-07-01" "2076-08-01"
 [873] "2076-09-01" "2076-10-01" "2076-11-01" "2076-12-01" "2077-01-01" "2077-02-01" "2077-03-01" "2077-04-01"
 [881] "2077-05-01" "2077-06-01" "2077-07-01" "2077-08-01" "2077-09-01" "2077-10-01" "2077-11-01" "2077-12-01"
 [889] "2078-01-01" "2078-02-01" "2078-03-01" "2078-04-01" "2078-05-01" "2078-06-01" "2078-07-01" "2078-08-01"
 [897] "2078-09-01" "2078-10-01" "2078-11-01" "2078-12-01" "2079-01-01" "2079-02-01" "2079-03-01" "2079-04-01"
 [905] "2079-05-01" "2079-06-01" "2079-07-01" "2079-08-01" "2079-09-01" "2079-10-01" "2079-11-01" "2079-12-01"
 [913] "2080-01-01" "2080-02-01" "2080-03-01" "2080-04-01" "2080-05-01" "2080-06-01" "2080-07-01" "2080-08-01"
 [921] "2080-09-01" "2080-10-01" "2080-11-01" "2080-12-01" "2081-01-01" "2081-02-01" "2081-03-01" "2081-04-01"
 [929] "2081-05-01" "2081-06-01" "2081-07-01" "2081-08-01" "2081-09-01" "2081-10-01" "2081-11-01" "2081-12-01"
 [937] "2082-01-01" "2082-02-01" "2082-03-01" "2082-04-01" "2082-05-01" "2082-06-01" "2082-07-01" "2082-08-01"
 [945] "2082-09-01" "2082-10-01" "2082-11-01" "2082-12-01" "2083-01-01" "2083-02-01" "2083-03-01" "2083-04-01"
 [953] "2083-05-01" "2083-06-01" "2083-07-01" "2083-08-01" "2083-09-01" "2083-10-01" "2083-11-01" "2083-12-01"
 [961] "2084-01-01" "2084-02-01" "2084-03-01" "2084-04-01" "2084-05-01" "2084-06-01" "2084-07-01" "2084-08-01"
 [969] "2084-09-01" "2084-10-01" "2084-11-01" "2084-12-01" "2085-01-01" "2085-02-01" "2085-03-01" "2085-04-01"
 [977] "2085-05-01" "2085-06-01" "2085-07-01" "2085-08-01" "2085-09-01" "2085-10-01" "2085-11-01" "2085-12-01"
 [985] "2086-01-01" "2086-02-01" "2086-03-01" "2086-04-01" "2086-05-01" "2086-06-01" "2086-07-01" "2086-08-01"
 [993] "2086-09-01" "2086-10-01" "2086-11-01" "2086-12-01" "2087-01-01" "2087-02-01" "2087-03-01" "2087-04-01"
 [ reached getOption("max.print") -- omitted 164 entries ]
time <-as.Date(time)
out <- as.matrix(CRD45_out_response)         ## convert from coda to matrix

code from AMW for splitting up this matrix

x_cols <- grep('^x', colnames(out))
obs_cols <- grep('^OBS', colnames(out))

out_x <- out[,x_cols]
out_obs <- out[,obs_cols]

rm(out)

out_x <- t(out_x)

out_x <- as.data.frame(out_x)
out_x2 <- out_x |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*x\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(low = quantile(val, probs = 0.025),
                   med = median(val),
                   high = quantile(val, probs = 0.975))
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
timesteps <- as.data.frame(time)
timesteps$ind <- as.character(seq(from = 1, to = nrow(timesteps), by = 1))
colnames(timesteps) <- c('time', 'timestep')

ponds <- as.data.frame(colnames(CR_WaterTemp45[-1]))
ponds$ind <- as.character(seq(from = 1, to = nrow(ponds), by = 1))
colnames(ponds) <- c('pond_name', 'pond')

out_x_mapped <- out_x2 |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond') |>
  dplyr::select(low, med, high, time, pond_name)
Adding missing grouping variables: `pond`
pX <- out_x_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = med)) +
  ggplot2::geom_ribbon(ggplot2::aes(x = time, ymin = low, ymax = high)) +
  ggplot2::facet_wrap(~pond_name)

out_obs <- t(out_obs)

out_obs <- as.data.frame(out_obs)

out_obs2 <- out_obs |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*OBS\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(low = quantile(val, probs = 0.025),
                   med = median(val),
                   high = quantile(val, probs = 0.975))
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
out_obs_mapped <- out_obs2 |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond') |>
  dplyr::select(low, med, high, time, pond_name)
Adding missing grouping variables: `pond`
pOBS <- out_obs_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = med)) +
  ggplot2::geom_ribbon(ggplot2::aes(x = time, ymin = low, ymax = high)) +
  ggplot2::facet_wrap(~pond_name)

cowplot::plot_grid(pX, pOBS)

Probability of Crossing Threshold

threshold_probs <- out_obs |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*OBS\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(n_iter = dplyr::n(),
                   n_thresh = sum(val > 20),
                   prob = (n_thresh / n_iter) * 100)
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
threshold_probs_mapped <- threshold_probs |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond')

threshold_probs_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = prob)) +
  ggplot2::facet_wrap(~pond_name)

Save these ouputs using a .RDataFile type

save.image(file = "Corr_PooledMod_CRD45.RData")

#Currently this has all the information in it. Eventually could limit this to be just the relavent information for the remaining code below

Making Graphs

Load in this file here as long as no code changes are needed above

load(file = "Corr_PooledMod_CRD45.RData")
Error in FUN(X[[i]], ...) : reached elapsed time limit

Creating some nice plots of these

  1. colored panel plot (each ponds forecast with the median, high, and low plus a trend line)
# set up the colors here for the plots below so that each pond has the same color each time
Mod_CRD45 <- out_obs_mapped
str(Mod_CRD45)
gropd_df [10,476 × 6] (S3: grouped_df/tbl_df/tbl/data.frame)
 $ pond     : chr [1:10476] "1" "1" "1" "1" ...
 $ low      : Named num [1:10476] -6.56 6.28 -3.28 6.35 7.45 ...
  ..- attr(*, "names")= chr [1:10476] "2.5%" "2.5%" "2.5%" "2.5%" ...
 $ med      : num [1:10476] -0.331 6.28 0.703 10.194 11.078 ...
 $ high     : Named num [1:10476] 5.77 6.28 4.52 14.12 14.68 ...
  ..- attr(*, "names")= chr [1:10476] "97.5%" "97.5%" "97.5%" "97.5%" ...
 $ time     : Date[1:10476], format: "2012-01-01" "2012-10-01" "2012-04-01" "2087-04-01" ...
 $ pond_name: chr [1:10476] "BVS" "BVS" "BVS" "BVS" ...
 - attr(*, "groups")= tibble [9 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ pond : chr [1:9] "1" "2" "3" "4" ...
  ..$ .rows: list<int> [1:9] 
  .. ..$ : int [1:1164] 1 2 3 4 5 6 7 8 9 10 ...
  .. ..$ : int [1:1164] 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 ...
  .. ..$ : int [1:1164] 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 ...
  .. ..$ : int [1:1164] 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 ...
  .. ..$ : int [1:1164] 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 ...
  .. ..$ : int [1:1164] 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 ...
  .. ..$ : int [1:1164] 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 ...
  .. ..$ : int [1:1164] 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 ...
  .. ..$ : int [1:1164] 9313 9314 9315 9316 9317 9318 9319 9320 9321 9322 ...
  .. ..@ ptype: int(0) 
  ..- attr(*, ".drop")= logi TRUE
write.csv(Mod_CRD45, "Corr_Mod_CRD45.csv")

# Define the custom color palette
CR_colors <- c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33", "#A65628", "#F781BF", "lightblue")

# Ensure that CR_colors has the same length as the number of unique ponds
unique_ponds <- unique(Mod_CRD45$pond_name)
if (length(CR_colors) != length(unique_ponds)) {
  stop("The number of colors in CR_colors does not match the number of unique ponds.")
}

# Create a named vector for CR_colors with pond names
color_mapping <- setNames(CR_colors, unique_ponds)

# Plotting
Ponds_CRD45 <- ggplot(data = Mod_CRD45, aes(x = time)) +
  geom_ribbon(aes(ymin = low, ymax = high, fill = pond_name)) +  # Add the ribbon with colors
  geom_line(aes(y = med, color = pond_name)) +  # Ensure lines are visible and colored by pond
  geom_smooth(aes(y = med, color = "grey"), size = 1) +  # Ensure lines are visible and colored by pond
  geom_vline(xintercept = as.Date("2020-12-01"), linetype = "dashed", color = "red") +  # Add vertical dashed red line
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_color_manual(values = color_mapping) +  # Use custom colors for lines
  scale_fill_manual(values = color_mapping) +   # Use custom colors for ribbons
  xlab("Year") +
  ylab("Water Temperature (°C)") +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 24),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
Ponds_CRD45
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
ggsave("Corr_IndPonds_CRD45.png", plot = Ponds_CRD45, width = 8, height = 6)
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

  1. Trend by pond (geom smooth for each pond on the same plot for comparison)
# using the same aestetics as above

Trends_CRD45 <- ggplot(data = Mod_CRD45, aes(x = time)) +
  geom_smooth(aes(y = med, color = pond_name, fill = pond_name), alpha = 0.15, size = 1) +  # Smooth lines with colors by pond_name
  scale_color_manual(values = color_mapping) +
  scale_fill_manual(values = color_mapping) +   # Use custom colors for ribbons
  labs(
       x = "Year",
       y = "Water Temperature (°C)",
       color = "Pond Name",
       fill = "Pond Name") +  # Labels for legend
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 18),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        legend.position = "right",
        legend.text = element_text(size = 16), # Change the legend text size here
        legend.title = element_text(size = 20)) # Position the legend on the right
Trends_CRD45
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
ggsave("Corr_IndTrends_CRD45.png", plot = Trends_CRD45, width = 9, height = 6)
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

  1. probability plot (by pond)
probs_CRD45 <- threshold_probs_mapped
write.csv(probs_CRD45, "Corr_probs_CRD45.csv")

Probs20_CRD45 <- ggplot(data = probs_CRD45, aes(x = time)) +
  geom_line(aes(y = prob, color = pond_name)) +  # Ensure lines are visible and colored by pond
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_color_manual(values = color_mapping) +  # Use custom colors for lines
  xlab("Year") +
  ylab("Probability") +
  xlim(as.Date(c("2020-12-01", "2099-12-01"))) +
  ylim(0,100) +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 18),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 18),
        axis.text.x = element_text(angle = 55, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
Probs20_CRD45
Warning: Removed 1935 rows containing missing values or values outside the scale range (`geom_line()`).
ggsave("Corr_Probs20_CRD45.png", plot = Probs20_CRD45, width = 9, height = 6)
Warning: Removed 1935 rows containing missing values or values outside the scale range (`geom_line()`).

  1. Model fits by pond
Mod_CRD45

ModObs <- Mod_CRD45 %>%
  filter(time < "2021-01-01")
range(ModObs$time)
[1] "2012-01-01" "2020-12-01"
ModelErrorPlot_CRD45 <- ggplot(data = ModObs, aes(x = time)) +
  geom_ribbon(aes(ymin = low, ymax = high, fill = pond_name)) +  # Adjust fill colors
  geom_line(aes(y = med), color = "black") +  # Black lines for the median values
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_fill_manual(values = color_mapping) +  # Apply custom color palette for ribbons
  labs(
       x = "Year",
       y = "Water Temperature (°C)",
       color = "Pond Name",
       fill = "Pond Name") +  # Labels for legend
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5),
    axis.title = element_text(size = 16),
    axis.text = element_text(size = 14),
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "none" # Angle x-axis labels if needed
  )
ModelErrorPlot_CRD45

ggsave("Corr_Error_CRD45.png", plot = ModelErrorPlot_CRD45, width = 9, height = 6)

Clear out the environment and reload the basics before starting the next section

rm(list = ls())

library(tidyverse)
library(rjags)
library(ggplot2)

set.seed(1)

RCP 8.5

Design the Model

Read in the data here, which is an output of XX code file

Then separate the data into air and water temperature files

# Air and water temperature data: CR location, 4.5 scenario
CR_Temps <- read.csv("CR_85SNAPForecast_MonCorr.csv", header=TRUE)

# Air temperature variables
CR_AirTemp85 <- CR_Temps %>%
  select(date, Airport, Air_MonthAvg, std, precision, Region)

# Water temperature variables
CR_WaterTemp85 <- CR_Temps %>%
  select(date, BVS, CAB, TIN, SQR, CAN, EYS, TIS, WDD, RHM)


# Set up a string of all the dates
time <- CR_WaterTemp85$date
length(time)
[1] 1164

Setting up the random walk model

dlm_pooled <- "
model{
#### Priors
for(p in 1:np){
x[1,p] ~ dnorm(x_ic, tau_ic) # Initial condition of water temperature
}
tau_obs ~ dgamma(a_obs, r_obs) # Prior on observation error
tau_add ~ dgamma(a_add, r_add) # Prior on process error

#### Fixed Effects
beta ~ dmnorm(mu_beta, tau_beta) # Prior on beta coefficients

for(p in 1:np){
int[p] ~ dnorm(mu_int, tau_int) # Prior on pond-specific intercepts
}

#### Data Model
for(t in 1:n){ # loop over all time steps
for(p in 1:np){
OBS[t,p] ~ dnorm(x[t,p], tau_obs) # Observed water temperature is drawn from latent air temperature with observation uncertainty
}
Xf[t] ~ dnorm(muAirTemp[t], tauAirTemp[t]) # Latent air temperature is drawn from mean and precision of forecasated air temperature
}

#### Process Model
for(t in 2:n){ # loop over all time steps except teh first (we defined ic above)
for(p in 1:np){
mu[t,p] <- x[t-1,p] + int[p] + beta[1] * x[t-1,p] + beta[2] * Xf[t] # Mean water temperature is a function of the previous time step and current air temperature
x[t,p] ~ dnorm(mu[t,p], tau_add) # Latent water temperature is drawn from mean water temperature with process uncertainty
}
}
}
"

Define the data and priors for the model

# Empty list
data <- list()
# Water temperature observations
data$OBS <- dplyr::select(CR_WaterTemp85, -date)
# Number of time steps
data$n <- nrow(data$OBS)
# Number of ponds
data$np <- ncol(data$OBS)
# Initial water temperature mean
data$x_ic <- 0.1
# Initial water temperature precision
data$tau_ic = 0.1
# Prior parameters for observation and process uncertainty
data$a_obs = 1
data$r_obs = 1
data$a_add = 1
data$r_add = 1
# Prior parameters for beta coefficients
data$mu_beta <- c(0, 0)
data$tau_beta <- diag(x = c(0.001, 0.001), nrow = 2, ncol = 2)
# Prior parameters for intercept
data$mu_int <- 0
data$tau_int <- 0.001
# Mean air temperature estimate
data$muAirTemp <- CR_AirTemp85$Air_MonthAvg
# Air temperature precision
data$tauAirTemp <- CR_AirTemp85$precision

Create JAGS model with 3 chains

jm <- jags.model(file = textConnection(dlm_pooled), data = data, n.chains = 3)
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 448
   Unobserved stochastic nodes: 21680
   Total graph size: 46573

Initializing model

Posterior samples of parameters

CRD85_out_params <- coda.samples(model = jm,
                               variable.names = c('beta', 'int',
                                                  'tau_add', 'tau_obs'),
                               n.iter = 50000, thin = 25)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Posterior samples of response variables

CRD85_out_response <- coda.samples(model = jm,
                                 variable.names = c('x', 'OBS'),
                                 n.iter = 100000, thin = 25)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

A couple quick checks here

# plot(CRD85_out_params)
gelman.diag(CRD85_out_params, confidence = 0.99)
Potential scale reduction factors:

        Point est. Upper C.I.
beta[1]          1          1
beta[2]          1          1
int[1]           1          1
int[2]           1          1
int[3]           1          1
int[4]           1          1
int[5]           1          1
int[6]           1          1
int[7]           1          1
int[8]           1          1
int[9]           1          1
tau_add          1          1
tau_obs          1          1

Multivariate psrf

1

Visualize the output by just looking at the 95% credible interval of the time-series of X’s and compare that to the observed Y’s

Transform the samples back from the log domain to the linear domain

time                               ## adjust to zoom in and out
   [1] "2012-01-01" "2012-02-01" "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01" "2012-07-01" "2012-08-01"
   [9] "2012-09-01" "2012-10-01" "2012-11-01" "2012-12-01" "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01"
  [17] "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01" "2013-10-01" "2013-11-01" "2013-12-01"
  [25] "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01" "2014-05-01" "2014-06-01" "2014-07-01" "2014-08-01"
  [33] "2014-09-01" "2014-10-01" "2014-11-01" "2014-12-01" "2015-01-01" "2015-02-01" "2015-03-01" "2015-04-01"
  [41] "2015-05-01" "2015-06-01" "2015-07-01" "2015-08-01" "2015-09-01" "2015-10-01" "2015-11-01" "2015-12-01"
  [49] "2016-01-01" "2016-02-01" "2016-03-01" "2016-04-01" "2016-05-01" "2016-06-01" "2016-07-01" "2016-08-01"
  [57] "2016-09-01" "2016-10-01" "2016-11-01" "2016-12-01" "2017-01-01" "2017-02-01" "2017-03-01" "2017-04-01"
  [65] "2017-05-01" "2017-06-01" "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01" "2017-11-01" "2017-12-01"
  [73] "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" "2018-05-01" "2018-06-01" "2018-07-01" "2018-08-01"
  [81] "2018-09-01" "2018-10-01" "2018-11-01" "2018-12-01" "2019-01-01" "2019-02-01" "2019-03-01" "2019-04-01"
  [89] "2019-05-01" "2019-06-01" "2019-07-01" "2019-08-01" "2019-09-01" "2019-10-01" "2019-11-01" "2019-12-01"
  [97] "2012-01-01" "2012-02-01" "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01" "2012-07-01" "2012-08-01"
 [105] "2012-09-01" "2012-10-01" "2012-11-01" "2012-12-01" "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01"
 [113] "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01" "2013-10-01" "2013-11-01" "2013-12-01"
 [121] "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01" "2014-05-01" "2014-06-01" "2014-07-01" "2014-08-01"
 [129] "2014-09-01" "2014-10-01" "2014-11-01" "2014-12-01" "2015-01-01" "2015-02-01" "2015-03-01" "2015-04-01"
 [137] "2015-05-01" "2015-06-01" "2015-07-01" "2015-08-01" "2015-09-01" "2015-10-01" "2015-11-01" "2015-12-01"
 [145] "2016-01-01" "2016-02-01" "2016-03-01" "2016-04-01" "2016-05-01" "2016-06-01" "2016-07-01" "2016-08-01"
 [153] "2016-09-01" "2016-10-01" "2016-11-01" "2016-12-01" "2017-01-01" "2017-02-01" "2017-03-01" "2017-04-01"
 [161] "2017-05-01" "2017-06-01" "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01" "2017-11-01" "2017-12-01"
 [169] "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" "2018-05-01" "2018-06-01" "2018-07-01" "2018-08-01"
 [177] "2018-09-01" "2018-10-01" "2018-11-01" "2018-12-01" "2019-01-01" "2019-02-01" "2019-03-01" "2019-04-01"
 [185] "2019-05-01" "2019-06-01" "2019-07-01" "2019-08-01" "2019-09-01" "2019-10-01" "2019-11-01" "2019-12-01"
 [193] "2020-01-01" "2020-02-01" "2020-03-01" "2020-04-01" "2020-05-01" "2020-06-01" "2020-07-01" "2020-08-01"
 [201] "2020-09-01" "2020-10-01" "2020-11-01" "2020-12-01" "2021-01-01" "2021-02-01" "2021-03-01" "2021-04-01"
 [209] "2021-05-01" "2021-06-01" "2021-07-01" "2021-08-01" "2021-09-01" "2021-10-01" "2021-11-01" "2021-12-01"
 [217] "2022-01-01" "2022-02-01" "2022-03-01" "2022-04-01" "2022-05-01" "2022-06-01" "2022-07-01" "2022-08-01"
 [225] "2022-09-01" "2022-10-01" "2022-11-01" "2022-12-01" "2023-01-01" "2023-02-01" "2023-03-01" "2023-04-01"
 [233] "2023-05-01" "2023-06-01" "2023-07-01" "2023-08-01" "2023-09-01" "2023-10-01" "2023-11-01" "2023-12-01"
 [241] "2024-01-01" "2024-02-01" "2024-03-01" "2024-04-01" "2024-05-01" "2024-06-01" "2024-07-01" "2024-08-01"
 [249] "2024-09-01" "2024-10-01" "2024-11-01" "2024-12-01" "2025-01-01" "2025-02-01" "2025-03-01" "2025-04-01"
 [257] "2025-05-01" "2025-06-01" "2025-07-01" "2025-08-01" "2025-09-01" "2025-10-01" "2025-11-01" "2025-12-01"
 [265] "2026-01-01" "2026-02-01" "2026-03-01" "2026-04-01" "2026-05-01" "2026-06-01" "2026-07-01" "2026-08-01"
 [273] "2026-09-01" "2026-10-01" "2026-11-01" "2026-12-01" "2027-01-01" "2027-02-01" "2027-03-01" "2027-04-01"
 [281] "2027-05-01" "2027-06-01" "2027-07-01" "2027-08-01" "2027-09-01" "2027-10-01" "2027-11-01" "2027-12-01"
 [289] "2028-01-01" "2028-02-01" "2028-03-01" "2028-04-01" "2028-05-01" "2028-06-01" "2028-07-01" "2028-08-01"
 [297] "2028-09-01" "2028-10-01" "2028-11-01" "2028-12-01" "2029-01-01" "2029-02-01" "2029-03-01" "2029-04-01"
 [305] "2029-05-01" "2029-06-01" "2029-07-01" "2029-08-01" "2029-09-01" "2029-10-01" "2029-11-01" "2029-12-01"
 [313] "2030-01-01" "2030-02-01" "2030-03-01" "2030-04-01" "2030-05-01" "2030-06-01" "2030-07-01" "2030-08-01"
 [321] "2030-09-01" "2030-10-01" "2030-11-01" "2030-12-01" "2031-01-01" "2031-02-01" "2031-03-01" "2031-04-01"
 [329] "2031-05-01" "2031-06-01" "2031-07-01" "2031-08-01" "2031-09-01" "2031-10-01" "2031-11-01" "2031-12-01"
 [337] "2032-01-01" "2032-02-01" "2032-03-01" "2032-04-01" "2032-05-01" "2032-06-01" "2032-07-01" "2032-08-01"
 [345] "2032-09-01" "2032-10-01" "2032-11-01" "2032-12-01" "2033-01-01" "2033-02-01" "2033-03-01" "2033-04-01"
 [353] "2033-05-01" "2033-06-01" "2033-07-01" "2033-08-01" "2033-09-01" "2033-10-01" "2033-11-01" "2033-12-01"
 [361] "2034-01-01" "2034-02-01" "2034-03-01" "2034-04-01" "2034-05-01" "2034-06-01" "2034-07-01" "2034-08-01"
 [369] "2034-09-01" "2034-10-01" "2034-11-01" "2034-12-01" "2035-01-01" "2035-02-01" "2035-03-01" "2035-04-01"
 [377] "2035-05-01" "2035-06-01" "2035-07-01" "2035-08-01" "2035-09-01" "2035-10-01" "2035-11-01" "2035-12-01"
 [385] "2036-01-01" "2036-02-01" "2036-03-01" "2036-04-01" "2036-05-01" "2036-06-01" "2036-07-01" "2036-08-01"
 [393] "2036-09-01" "2036-10-01" "2036-11-01" "2036-12-01" "2037-01-01" "2037-02-01" "2037-03-01" "2037-04-01"
 [401] "2037-05-01" "2037-06-01" "2037-07-01" "2037-08-01" "2037-09-01" "2037-10-01" "2037-11-01" "2037-12-01"
 [409] "2038-01-01" "2038-02-01" "2038-03-01" "2038-04-01" "2038-05-01" "2038-06-01" "2038-07-01" "2038-08-01"
 [417] "2038-09-01" "2038-10-01" "2038-11-01" "2038-12-01" "2039-01-01" "2039-02-01" "2039-03-01" "2039-04-01"
 [425] "2039-05-01" "2039-06-01" "2039-07-01" "2039-08-01" "2039-09-01" "2039-10-01" "2039-11-01" "2039-12-01"
 [433] "2040-01-01" "2040-02-01" "2040-03-01" "2040-04-01" "2040-05-01" "2040-06-01" "2040-07-01" "2040-08-01"
 [441] "2040-09-01" "2040-10-01" "2040-11-01" "2040-12-01" "2041-01-01" "2041-02-01" "2041-03-01" "2041-04-01"
 [449] "2041-05-01" "2041-06-01" "2041-07-01" "2041-08-01" "2041-09-01" "2041-10-01" "2041-11-01" "2041-12-01"
 [457] "2042-01-01" "2042-02-01" "2042-03-01" "2042-04-01" "2042-05-01" "2042-06-01" "2042-07-01" "2042-08-01"
 [465] "2042-09-01" "2042-10-01" "2042-11-01" "2042-12-01" "2043-01-01" "2043-02-01" "2043-03-01" "2043-04-01"
 [473] "2043-05-01" "2043-06-01" "2043-07-01" "2043-08-01" "2043-09-01" "2043-10-01" "2043-11-01" "2043-12-01"
 [481] "2044-01-01" "2044-02-01" "2044-03-01" "2044-04-01" "2044-05-01" "2044-06-01" "2044-07-01" "2044-08-01"
 [489] "2044-09-01" "2044-10-01" "2044-11-01" "2044-12-01" "2045-01-01" "2045-02-01" "2045-03-01" "2045-04-01"
 [497] "2045-05-01" "2045-06-01" "2045-07-01" "2045-08-01" "2045-09-01" "2045-10-01" "2045-11-01" "2045-12-01"
 [505] "2046-01-01" "2046-02-01" "2046-03-01" "2046-04-01" "2046-05-01" "2046-06-01" "2046-07-01" "2046-08-01"
 [513] "2046-09-01" "2046-10-01" "2046-11-01" "2046-12-01" "2047-01-01" "2047-02-01" "2047-03-01" "2047-04-01"
 [521] "2047-05-01" "2047-06-01" "2047-07-01" "2047-08-01" "2047-09-01" "2047-10-01" "2047-11-01" "2047-12-01"
 [529] "2048-01-01" "2048-02-01" "2048-03-01" "2048-04-01" "2048-05-01" "2048-06-01" "2048-07-01" "2048-08-01"
 [537] "2048-09-01" "2048-10-01" "2048-11-01" "2048-12-01" "2049-01-01" "2049-02-01" "2049-03-01" "2049-04-01"
 [545] "2049-05-01" "2049-06-01" "2049-07-01" "2049-08-01" "2049-09-01" "2049-10-01" "2049-11-01" "2049-12-01"
 [553] "2050-01-01" "2050-02-01" "2050-03-01" "2050-04-01" "2050-05-01" "2050-06-01" "2050-07-01" "2050-08-01"
 [561] "2050-09-01" "2050-10-01" "2050-11-01" "2050-12-01" "2051-01-01" "2051-02-01" "2051-03-01" "2051-04-01"
 [569] "2051-05-01" "2051-06-01" "2051-07-01" "2051-08-01" "2051-09-01" "2051-10-01" "2051-11-01" "2051-12-01"
 [577] "2052-01-01" "2052-02-01" "2052-03-01" "2052-04-01" "2052-05-01" "2052-06-01" "2052-07-01" "2052-08-01"
 [585] "2052-09-01" "2052-10-01" "2052-11-01" "2052-12-01" "2053-01-01" "2053-02-01" "2053-03-01" "2053-04-01"
 [593] "2053-05-01" "2053-06-01" "2053-07-01" "2053-08-01" "2053-09-01" "2053-10-01" "2053-11-01" "2053-12-01"
 [601] "2054-01-01" "2054-02-01" "2054-03-01" "2054-04-01" "2054-05-01" "2054-06-01" "2054-07-01" "2054-08-01"
 [609] "2054-09-01" "2054-10-01" "2054-11-01" "2054-12-01" "2055-01-01" "2055-02-01" "2055-03-01" "2055-04-01"
 [617] "2055-05-01" "2055-06-01" "2055-07-01" "2055-08-01" "2055-09-01" "2055-10-01" "2055-11-01" "2055-12-01"
 [625] "2056-01-01" "2056-02-01" "2056-03-01" "2056-04-01" "2056-05-01" "2056-06-01" "2056-07-01" "2056-08-01"
 [633] "2056-09-01" "2056-10-01" "2056-11-01" "2056-12-01" "2057-01-01" "2057-02-01" "2057-03-01" "2057-04-01"
 [641] "2057-05-01" "2057-06-01" "2057-07-01" "2057-08-01" "2057-09-01" "2057-10-01" "2057-11-01" "2057-12-01"
 [649] "2058-01-01" "2058-02-01" "2058-03-01" "2058-04-01" "2058-05-01" "2058-06-01" "2058-07-01" "2058-08-01"
 [657] "2058-09-01" "2058-10-01" "2058-11-01" "2058-12-01" "2059-01-01" "2059-02-01" "2059-03-01" "2059-04-01"
 [665] "2059-05-01" "2059-06-01" "2059-07-01" "2059-08-01" "2059-09-01" "2059-10-01" "2059-11-01" "2059-12-01"
 [673] "2060-01-01" "2060-02-01" "2060-03-01" "2060-04-01" "2060-05-01" "2060-06-01" "2060-07-01" "2060-08-01"
 [681] "2060-09-01" "2060-10-01" "2060-11-01" "2060-12-01" "2061-01-01" "2061-02-01" "2061-03-01" "2061-04-01"
 [689] "2061-05-01" "2061-06-01" "2061-07-01" "2061-08-01" "2061-09-01" "2061-10-01" "2061-11-01" "2061-12-01"
 [697] "2062-01-01" "2062-02-01" "2062-03-01" "2062-04-01" "2062-05-01" "2062-06-01" "2062-07-01" "2062-08-01"
 [705] "2062-09-01" "2062-10-01" "2062-11-01" "2062-12-01" "2063-01-01" "2063-02-01" "2063-03-01" "2063-04-01"
 [713] "2063-05-01" "2063-06-01" "2063-07-01" "2063-08-01" "2063-09-01" "2063-10-01" "2063-11-01" "2063-12-01"
 [721] "2064-01-01" "2064-02-01" "2064-03-01" "2064-04-01" "2064-05-01" "2064-06-01" "2064-07-01" "2064-08-01"
 [729] "2064-09-01" "2064-10-01" "2064-11-01" "2064-12-01" "2065-01-01" "2065-02-01" "2065-03-01" "2065-04-01"
 [737] "2065-05-01" "2065-06-01" "2065-07-01" "2065-08-01" "2065-09-01" "2065-10-01" "2065-11-01" "2065-12-01"
 [745] "2066-01-01" "2066-02-01" "2066-03-01" "2066-04-01" "2066-05-01" "2066-06-01" "2066-07-01" "2066-08-01"
 [753] "2066-09-01" "2066-10-01" "2066-11-01" "2066-12-01" "2067-01-01" "2067-02-01" "2067-03-01" "2067-04-01"
 [761] "2067-05-01" "2067-06-01" "2067-07-01" "2067-08-01" "2067-09-01" "2067-10-01" "2067-11-01" "2067-12-01"
 [769] "2068-01-01" "2068-02-01" "2068-03-01" "2068-04-01" "2068-05-01" "2068-06-01" "2068-07-01" "2068-08-01"
 [777] "2068-09-01" "2068-10-01" "2068-11-01" "2068-12-01" "2069-01-01" "2069-02-01" "2069-03-01" "2069-04-01"
 [785] "2069-05-01" "2069-06-01" "2069-07-01" "2069-08-01" "2069-09-01" "2069-10-01" "2069-11-01" "2069-12-01"
 [793] "2070-01-01" "2070-02-01" "2070-03-01" "2070-04-01" "2070-05-01" "2070-06-01" "2070-07-01" "2070-08-01"
 [801] "2070-09-01" "2070-10-01" "2070-11-01" "2070-12-01" "2071-01-01" "2071-02-01" "2071-03-01" "2071-04-01"
 [809] "2071-05-01" "2071-06-01" "2071-07-01" "2071-08-01" "2071-09-01" "2071-10-01" "2071-11-01" "2071-12-01"
 [817] "2072-01-01" "2072-02-01" "2072-03-01" "2072-04-01" "2072-05-01" "2072-06-01" "2072-07-01" "2072-08-01"
 [825] "2072-09-01" "2072-10-01" "2072-11-01" "2072-12-01" "2073-01-01" "2073-02-01" "2073-03-01" "2073-04-01"
 [833] "2073-05-01" "2073-06-01" "2073-07-01" "2073-08-01" "2073-09-01" "2073-10-01" "2073-11-01" "2073-12-01"
 [841] "2074-01-01" "2074-02-01" "2074-03-01" "2074-04-01" "2074-05-01" "2074-06-01" "2074-07-01" "2074-08-01"
 [849] "2074-09-01" "2074-10-01" "2074-11-01" "2074-12-01" "2075-01-01" "2075-02-01" "2075-03-01" "2075-04-01"
 [857] "2075-05-01" "2075-06-01" "2075-07-01" "2075-08-01" "2075-09-01" "2075-10-01" "2075-11-01" "2075-12-01"
 [865] "2076-01-01" "2076-02-01" "2076-03-01" "2076-04-01" "2076-05-01" "2076-06-01" "2076-07-01" "2076-08-01"
 [873] "2076-09-01" "2076-10-01" "2076-11-01" "2076-12-01" "2077-01-01" "2077-02-01" "2077-03-01" "2077-04-01"
 [881] "2077-05-01" "2077-06-01" "2077-07-01" "2077-08-01" "2077-09-01" "2077-10-01" "2077-11-01" "2077-12-01"
 [889] "2078-01-01" "2078-02-01" "2078-03-01" "2078-04-01" "2078-05-01" "2078-06-01" "2078-07-01" "2078-08-01"
 [897] "2078-09-01" "2078-10-01" "2078-11-01" "2078-12-01" "2079-01-01" "2079-02-01" "2079-03-01" "2079-04-01"
 [905] "2079-05-01" "2079-06-01" "2079-07-01" "2079-08-01" "2079-09-01" "2079-10-01" "2079-11-01" "2079-12-01"
 [913] "2080-01-01" "2080-02-01" "2080-03-01" "2080-04-01" "2080-05-01" "2080-06-01" "2080-07-01" "2080-08-01"
 [921] "2080-09-01" "2080-10-01" "2080-11-01" "2080-12-01" "2081-01-01" "2081-02-01" "2081-03-01" "2081-04-01"
 [929] "2081-05-01" "2081-06-01" "2081-07-01" "2081-08-01" "2081-09-01" "2081-10-01" "2081-11-01" "2081-12-01"
 [937] "2082-01-01" "2082-02-01" "2082-03-01" "2082-04-01" "2082-05-01" "2082-06-01" "2082-07-01" "2082-08-01"
 [945] "2082-09-01" "2082-10-01" "2082-11-01" "2082-12-01" "2083-01-01" "2083-02-01" "2083-03-01" "2083-04-01"
 [953] "2083-05-01" "2083-06-01" "2083-07-01" "2083-08-01" "2083-09-01" "2083-10-01" "2083-11-01" "2083-12-01"
 [961] "2084-01-01" "2084-02-01" "2084-03-01" "2084-04-01" "2084-05-01" "2084-06-01" "2084-07-01" "2084-08-01"
 [969] "2084-09-01" "2084-10-01" "2084-11-01" "2084-12-01" "2085-01-01" "2085-02-01" "2085-03-01" "2085-04-01"
 [977] "2085-05-01" "2085-06-01" "2085-07-01" "2085-08-01" "2085-09-01" "2085-10-01" "2085-11-01" "2085-12-01"
 [985] "2086-01-01" "2086-02-01" "2086-03-01" "2086-04-01" "2086-05-01" "2086-06-01" "2086-07-01" "2086-08-01"
 [993] "2086-09-01" "2086-10-01" "2086-11-01" "2086-12-01" "2087-01-01" "2087-02-01" "2087-03-01" "2087-04-01"
 [ reached getOption("max.print") -- omitted 164 entries ]
time <-as.Date(time)
out <- as.matrix(CRD85_out_response)         ## convert from coda to matrix

code from AMW for splitting up this matrix

x_cols <- grep('^x', colnames(out))
obs_cols <- grep('^OBS', colnames(out))

out_x <- out[,x_cols]
out_obs <- out[,obs_cols]

rm(out)

out_x <- t(out_x)

out_x <- as.data.frame(out_x)
out_x2 <- out_x |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*x\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(low = quantile(val, probs = 0.025),
                   med = median(val),
                   high = quantile(val, probs = 0.975))
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
timesteps <- as.data.frame(time)
timesteps$ind <- as.character(seq(from = 1, to = nrow(timesteps), by = 1))
colnames(timesteps) <- c('time', 'timestep')

ponds <- as.data.frame(colnames(CR_WaterTemp85[-1]))
ponds$ind <- as.character(seq(from = 1, to = nrow(ponds), by = 1))
colnames(ponds) <- c('pond_name', 'pond')

out_x_mapped <- out_x2 |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond') |>
  dplyr::select(low, med, high, time, pond_name)
Adding missing grouping variables: `pond`
pX <- out_x_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = med)) +
  ggplot2::geom_ribbon(ggplot2::aes(x = time, ymin = low, ymax = high)) +
  ggplot2::facet_wrap(~pond_name)

out_obs <- t(out_obs)

out_obs <- as.data.frame(out_obs)

out_obs2 <- out_obs |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*OBS\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(low = quantile(val, probs = 0.025),
                   med = median(val),
                   high = quantile(val, probs = 0.975))
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
out_obs_mapped <- out_obs2 |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond') |>
  dplyr::select(low, med, high, time, pond_name)
Adding missing grouping variables: `pond`
pOBS <- out_obs_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = med)) +
  ggplot2::geom_ribbon(ggplot2::aes(x = time, ymin = low, ymax = high)) +
  ggplot2::facet_wrap(~pond_name)

cowplot::plot_grid(pX, pOBS)

Probability of Crossing Threshold

threshold_probs <- out_obs |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*OBS\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(n_iter = dplyr::n(),
                   n_thresh = sum(val > 20),
                   prob = (n_thresh / n_iter) * 100)
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
threshold_probs_mapped <- threshold_probs |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond')

threshold_probs_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = prob)) +
  ggplot2::facet_wrap(~pond_name)

Save these ouputs using a .RDataFile type

save.image(file = "Corr_PooledMod_CRD85.RData")
rsession-arm64(34934) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
#Currently this has all the information in it. Eventually could limit this to be just the relavent information for the remaining code below

Makeing Graphs

Load in this file here as long as no code changes are needed above

load(file = "Corr_PooledMod_CRD85.RData")
rsession-arm64(35067) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.

Creating some nice plots of these

  1. colored panel plot (each ponds forecast with the median, high, and low plus a trend line)
# set up the colors here for the plots below so that each pond has the same color each time
Mod_CRD85 <- out_obs_mapped
str(Mod_CRD85)
gropd_df [10,476 × 6] (S3: grouped_df/tbl_df/tbl/data.frame)
 $ pond     : chr [1:10476] "1" "1" "1" "1" ...
 $ low      : Named num [1:10476] -6.57 6.28 -4.6 6.58 8.28 ...
  ..- attr(*, "names")= chr [1:10476] "2.5%" "2.5%" "2.5%" "2.5%" ...
 $ med      : num [1:10476] -0.386 6.28 -0.276 10.645 13.017 ...
 $ high     : Named num [1:10476] 5.75 6.28 3.76 14.94 18.02 ...
  ..- attr(*, "names")= chr [1:10476] "97.5%" "97.5%" "97.5%" "97.5%" ...
 $ time     : Date[1:10476], format: "2012-01-01" "2012-10-01" "2012-04-01" "2087-04-01" ...
 $ pond_name: chr [1:10476] "BVS" "BVS" "BVS" "BVS" ...
 - attr(*, "groups")= tibble [9 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ pond : chr [1:9] "1" "2" "3" "4" ...
  ..$ .rows: list<int> [1:9] 
  .. ..$ : int [1:1164] 1 2 3 4 5 6 7 8 9 10 ...
  .. ..$ : int [1:1164] 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 ...
  .. ..$ : int [1:1164] 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 ...
  .. ..$ : int [1:1164] 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 ...
  .. ..$ : int [1:1164] 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 ...
  .. ..$ : int [1:1164] 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 ...
  .. ..$ : int [1:1164] 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 ...
  .. ..$ : int [1:1164] 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 ...
  .. ..$ : int [1:1164] 9313 9314 9315 9316 9317 9318 9319 9320 9321 9322 ...
  .. ..@ ptype: int(0) 
  ..- attr(*, ".drop")= logi TRUE
write.csv(Mod_CRD85, "Corr_Mod_CRD85.csv")

# Define the custom color palette
CR_colors <- c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33", "#A65628", "#F781BF", "lightblue")

# Ensure that CR_colors has the same length as the number of unique ponds
unique_ponds <- unique(Mod_CRD85$pond_name)
if (length(CR_colors) != length(unique_ponds)) {
  stop("The number of colors in CR_colors does not match the number of unique ponds.")
}

# Create a named vector for CR_colors with pond names
color_mapping <- setNames(CR_colors, unique_ponds)

# Plotting
Ponds_CRD85 <- ggplot(data = Mod_CRD85, aes(x = time)) +
  geom_ribbon(aes(ymin = low, ymax = high, fill = pond_name)) +  # Add the ribbon with colors
  geom_line(aes(y = med, color = pond_name)) +  # Ensure lines are visible and colored by pond
  geom_smooth(aes(y = med, color = "grey"), size = 1) +  # Ensure lines are visible and colored by pond
  geom_vline(xintercept = as.Date("2020-12-01"), linetype = "dashed", color = "red") +  # Add vertical dashed red line
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_color_manual(values = color_mapping) +  # Use custom colors for lines
  scale_fill_manual(values = color_mapping) +   # Use custom colors for ribbons
  xlab("Year") +
  ylab("Water Temperature (°C)") +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 24),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
Ponds_CRD85
rsession-arm64(35069) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
ggsave("Corr_IndPonds_CRD85.png", plot = Ponds_CRD85, width = 8, height = 6)
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
rsession-arm64(35085) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.

  1. trend by pond (geom smooth for each pond on the same plot for comparison)
# using the same aestetics as above

Trends_CRD85 <- ggplot(data = Mod_CRD85, aes(x = time)) +
  geom_smooth(aes(y = med, color = pond_name, fill = pond_name), alpha = 0.15, size = 1) +  # Smooth lines with colors by pond_name
  scale_color_manual(values = color_mapping) +
  scale_fill_manual(values = color_mapping) +   # Use custom colors for ribbons
  labs(
       x = "Year",
       y = "Water Temperature (°C)",
       color = "Pond Name",
       fill = "Pond Name") +  # Labels for legend
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 18),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        legend.position = "right",
        legend.text = element_text(size = 16), # Change the legend text size here
        legend.title = element_text(size = 20))
Trends_CRD85
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
ggsave("Corr_IndTrends_CRD85.png", plot = Trends_CRD85, width = 9, height = 6)
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

  1. probability plot (by pond)
probs_CRD85 <- threshold_probs_mapped
write.csv(probs_CRD85, "probs_CRD85.csv")

Probs20_CRD85 <- ggplot(data = probs_CRD85, aes(x = time)) +
  geom_line(aes(y = prob, color = pond_name)) +  # Ensure lines are visible and colored by pond
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_color_manual(values = color_mapping) +  # Use custom colors for lines
  xlab("Year") +
  ylab("Probability") +
  xlim(as.Date(c("2020-12-01", "2099-12-01"))) +
  ylim(0,100) +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 18),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 18),
        axis.text.x = element_text(angle = 55, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
Probs20_CRD85
rsession-arm64(35087) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
Warning: Removed 1935 rows containing missing values or values outside the scale range (`geom_line()`).
ggsave("Corr_Probs20_CRD85.png", plot = Probs20_CRD85, width = 9, height = 6)
Warning: Removed 1935 rows containing missing values or values outside the scale range (`geom_line()`).

rsession-arm64(35089) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
  1. Model fits by pond
Mod_CRD85

ModObs <- Mod_CRD85 %>%
  filter(time < "2021-01-01")
range(ModObs$time)
[1] "2012-01-01" "2020-12-01"
ModelErrorPlot_CRD85 <- ggplot(data = ModObs, aes(x = time)) +
  geom_ribbon(aes(ymin = low, ymax = high, fill = pond_name)) +  # Adjust fill colors
  geom_line(aes(y = med), color = "black") +  # Black lines for the median values
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_fill_manual(values = color_mapping) +  # Apply custom color palette for ribbons
  labs(
       x = "Year",
       y = "Water Temperature (°C)",
       color = "Pond Name",
       fill = "Pond Name") +  # Labels for legend
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 24),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
ModelErrorPlot_CRD85

ggsave("Corr_Error_CRD85.png", plot = ModelErrorPlot_CRD85, width = 9, height = 6)

Calculating NSE values

Mod_CRD85

# Filter this to only the observational data
obs_CRD85 <- Mod_CRD85 %>%
  filter(time < as.Date("2020-01-01")) %>%
  ungroup() %>%
  as.data.frame()

# Convert the 'date' column in CR_WaterTemp85 to Date type and rename it to 'time'
CR_WaterTemp85 <- CR_WaterTemp85 %>%
  mutate(time = as.Date(date))

# BVS ####
BVS_CRD <- obs_CRD85 %>%
  filter(pond_name == "BVS")

# Perform the merge to combine the data frames based on the time/date columns
BVS_combined <- BVS_CRD %>%
  select(time, med) %>%
  left_join(CR_WaterTemp85, by = "time")
Warning in left_join(., CR_WaterTemp85, by = "time") :
  Detected an unexpected many-to-many relationship between `x` and `y`.
ℹ Row 1 of `x` matches multiple rows in `y`.
ℹ Row 10 of `y` matches multiple rows in `x`.
ℹ If a many-to-many relationship is expected, set `relationship = "many-to-many"` to silence this warning.
BVS_NSE <- NSE(BVS_combined$med, BVS_combined$BVS, na.rm = TRUE)
BVS_NSE
[1] 0.7884355
# CAB ####
CAB_CRD <- obs_CRD85 %>%
  filter(pond_name == "CAB")

# Perform the merge to combine the data frames based on the time/date columns
CAB_combined <- CAB_CRD %>%
  select(time, med) %>%
  left_join(CR_WaterTemp85, by = "time")
Warning in left_join(., CR_WaterTemp85, by = "time") :
  Detected an unexpected many-to-many relationship between `x` and `y`.
ℹ Row 1 of `x` matches multiple rows in `y`.
ℹ Row 10 of `y` matches multiple rows in `x`.
ℹ If a many-to-many relationship is expected, set `relationship = "many-to-many"` to silence this warning.
CAB_NSE <- NSE(CAB_combined$med, CAB_combined$CAB, na.rm = TRUE)
CAB_NSE
[1] 0.8038882
# CAN ####
CAN_CRD <- obs_CRD85 %>%
  filter(pond_name == "CAN")

# Perform the merge to combine the data frames based on the time/date columns
CAN_combined <- CAN_CRD %>%
  select(time, med) %>%
  left_join(CR_WaterTemp85, by = "time")
Warning in left_join(., CR_WaterTemp85, by = "time") :
  Detected an unexpected many-to-many relationship between `x` and `y`.
ℹ Row 1 of `x` matches multiple rows in `y`.
ℹ Row 10 of `y` matches multiple rows in `x`.
ℹ If a many-to-many relationship is expected, set `relationship = "many-to-many"` to silence this warning.
CAN_NSE <- NSE(CAN_combined$med, CAN_combined$CAN, na.rm = TRUE)
CAN_NSE
[1] 0.7600726
# CAN ####
CAN_CRD <- obs_CRD85 %>%
  filter(pond_name == "CAN")

# Perform the merge to combine the data frames based on the time/date columns
CAN_combined <- CAN_CRD %>%
  select(time, med) %>%
  left_join(CR_WaterTemp85, by = "time")
Warning in left_join(., CR_WaterTemp85, by = "time") :
  Detected an unexpected many-to-many relationship between `x` and `y`.
ℹ Row 1 of `x` matches multiple rows in `y`.
ℹ Row 10 of `y` matches multiple rows in `x`.
ℹ If a many-to-many relationship is expected, set `relationship = "many-to-many"` to silence this warning.
CAN_NSE <- NSE(CAN_combined$med, CAN_combined$CAN, na.rm = TRUE)
CAN_NSE
[1] 0.7600726

Clear out the environment and reload the basics before starting the next section

rm(list = ls())

library(tidyverse)
library(rjags)
library(ggplot2)

set.seed(1)

Continueing with Yakutat Forelands (YF)

RCP 4.5

Design the Model

Read in the data here, which is an output of XX code file

Then separate the data into air and water temperature files

# Air and water temperature data: YF location, 4.5 scenario
YF_Temps <- read.csv("YF_45SNAPForecast_MonCorr.csv", header=TRUE)

# Air temperature variables
YF_AirTemp45 <- YF_Temps %>%
  select(date, Airport, Air_MonthAvg, std, precision, Region)

# Water temperature variables
YF_WaterTemp45 <- YF_Temps %>%
  select(date, MP1, MP3, MP5, MP8, PL1, PL2, PL3, UBP1, UBP2, UBP3, UBP4)


# Set up a string of all the dates
time <- YF_WaterTemp45$date
length(time)
[1] 1164

Setting up the random walk model

dlm_pooled <- "
model{
#### Priors
for(p in 1:np){
x[1,p] ~ dnorm(x_ic, tau_ic) # Initial condition of water temperature
}
tau_obs ~ dgamma(a_obs, r_obs) # Prior on observation error
tau_add ~ dgamma(a_add, r_add) # Prior on process error

#### Fixed Effects
beta ~ dmnorm(mu_beta, tau_beta) # Prior on beta coefficients

for(p in 1:np){
int[p] ~ dnorm(mu_int, tau_int) # Prior on pond-specific intercepts
}

#### Data Model
for(t in 1:n){ # loop over all time steps
for(p in 1:np){
OBS[t,p] ~ dnorm(x[t,p], tau_obs) # Observed water temperature is drawn from latent air temperature with observation uncertainty
}
Xf[t] ~ dnorm(muAirTemp[t], tauAirTemp[t]) # Latent air temperature is drawn from mean and precision of forecasated air temperature
}

#### Process Model
for(t in 2:n){ # loop over all time steps except teh first (we defined ic above)
for(p in 1:np){
mu[t,p] <- x[t-1,p] + int[p] + beta[1] * x[t-1,p] + beta[2] * Xf[t] # Mean water temperature is a function of the previous time step and current air temperature
x[t,p] ~ dnorm(mu[t,p], tau_add) # Latent water temperature is drawn from mean water temperature with process uncertainty
}
}
}
"

Define the data and priors for the model

# Empty list
data <- list()
# Water temperature observations
data$OBS <- dplyr::select(YF_WaterTemp45, -date)
# Number of time steps
data$n <- nrow(data$OBS)
# Number of ponds
data$np <- ncol(data$OBS)
# Initial water temperature mean
data$x_ic <- 0.1
# Initial water temperature precision
data$tau_ic = 0.1
# Prior parameters for observation and process uncertainty
data$a_obs = 1
data$r_obs = 1
data$a_add = 1
data$r_add = 1
# Prior parameters for beta coefficients
data$mu_beta <- c(0, 0)
data$tau_beta <- diag(x = c(0.001, 0.001), nrow = 2, ncol = 2)
# Prior parameters for intercept
data$mu_int <- 0
data$tau_int <- 0.001
# Mean air temperature estimate
data$muAirTemp <- YF_AirTemp45$Air_MonthAvg
# Air temperature precision
data$tauAirTemp <- YF_AirTemp45$precision

Create JAGS model with 3 chains

jm <- jags.model(file = textConnection(dlm_pooled), data = data, n.chains = 3)
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 456
   Unobserved stochastic nodes: 26330
   Total graph size: 55883

Initializing model
rsession-arm64(35092) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.

Posterior samples of parameters

YF45_out_params <- coda.samples(model = jm,
                               variable.names = c('beta', 'int',
                                                  'tau_add', 'tau_obs'),
                               n.iter = 100000, thin = 25)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Posterior samples of response variables

YF45_out_response <- coda.samples(model = jm,
                                 variable.names = c('x', 'OBS'),
                                 n.iter = 100000, thin = 25)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

A couple quick checks here

# plot(YF45_out_params)
gelman.diag(YF45_out_params, confidence = 0.99)
Potential scale reduction factors:

        Point est. Upper C.I.
beta[1]       1.00       1.02
beta[2]       1.01       1.03
int[1]        1.01       1.05
int[2]        1.01       1.05
int[3]        1.01       1.05
int[4]        1.01       1.05
int[5]        1.01       1.05
int[6]        1.01       1.04
int[7]        1.01       1.05
int[8]        1.01       1.04
int[9]        1.01       1.05
int[10]       1.01       1.04
int[11]       1.01       1.05
tau_add       1.00       1.01
tau_obs       1.00       1.00

Multivariate psrf

1.01

Visualize the output by just looking at the 95% credible interval of the time-series of X’s and compare that to the observed Y’s

Transform the samples back from the log domain to the linear domain

time                               ## adjust to zoom in and out
   [1] "2012-01-01" "2012-02-01" "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01" "2012-07-01" "2012-08-01"
   [9] "2012-09-01" "2012-10-01" "2012-11-01" "2012-12-01" "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01"
  [17] "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01" "2013-10-01" "2013-11-01" "2013-12-01"
  [25] "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01" "2014-05-01" "2014-06-01" "2014-07-01" "2014-08-01"
  [33] "2014-09-01" "2014-10-01" "2014-11-01" "2014-12-01" "2015-01-01" "2015-02-01" "2015-03-01" "2015-04-01"
  [41] "2015-05-01" "2015-06-01" "2015-07-01" "2015-08-01" "2015-09-01" "2015-10-01" "2015-11-01" "2015-12-01"
  [49] "2016-01-01" "2016-02-01" "2016-03-01" "2016-04-01" "2016-05-01" "2016-06-01" "2016-07-01" "2016-08-01"
  [57] "2016-09-01" "2016-10-01" "2016-11-01" "2016-12-01" "2017-01-01" "2017-02-01" "2017-03-01" "2017-04-01"
  [65] "2017-05-01" "2017-06-01" "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01" "2017-11-01" "2017-12-01"
  [73] "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" "2018-05-01" "2018-06-01" "2018-07-01" "2018-08-01"
  [81] "2018-09-01" "2018-10-01" "2018-11-01" "2018-12-01" "2019-01-01" "2019-02-01" "2019-03-01" "2019-04-01"
  [89] "2019-05-01" "2019-06-01" "2019-07-01" "2019-08-01" "2019-09-01" "2019-10-01" "2019-11-01" "2019-12-01"
  [97] "2012-01-01" "2012-02-01" "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01" "2012-07-01" "2012-08-01"
 [105] "2012-09-01" "2012-10-01" "2012-11-01" "2012-12-01" "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01"
 [113] "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01" "2013-10-01" "2013-11-01" "2013-12-01"
 [121] "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01" "2014-05-01" "2014-06-01" "2014-07-01" "2014-08-01"
 [129] "2014-09-01" "2014-10-01" "2014-11-01" "2014-12-01" "2015-01-01" "2015-02-01" "2015-03-01" "2015-04-01"
 [137] "2015-05-01" "2015-06-01" "2015-07-01" "2015-08-01" "2015-09-01" "2015-10-01" "2015-11-01" "2015-12-01"
 [145] "2016-01-01" "2016-02-01" "2016-03-01" "2016-04-01" "2016-05-01" "2016-06-01" "2016-07-01" "2016-08-01"
 [153] "2016-09-01" "2016-10-01" "2016-11-01" "2016-12-01" "2017-01-01" "2017-02-01" "2017-03-01" "2017-04-01"
 [161] "2017-05-01" "2017-06-01" "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01" "2017-11-01" "2017-12-01"
 [169] "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" "2018-05-01" "2018-06-01" "2018-07-01" "2018-08-01"
 [177] "2018-09-01" "2018-10-01" "2018-11-01" "2018-12-01" "2019-01-01" "2019-02-01" "2019-03-01" "2019-04-01"
 [185] "2019-05-01" "2019-06-01" "2019-07-01" "2019-08-01" "2019-09-01" "2019-10-01" "2019-11-01" "2019-12-01"
 [193] "2020-01-01" "2020-02-01" "2020-03-01" "2020-04-01" "2020-05-01" "2020-06-01" "2020-07-01" "2020-08-01"
 [201] "2020-09-01" "2020-10-01" "2020-11-01" "2020-12-01" "2021-01-01" "2021-02-01" "2021-03-01" "2021-04-01"
 [209] "2021-05-01" "2021-06-01" "2021-07-01" "2021-08-01" "2021-09-01" "2021-10-01" "2021-11-01" "2021-12-01"
 [217] "2022-01-01" "2022-02-01" "2022-03-01" "2022-04-01" "2022-05-01" "2022-06-01" "2022-07-01" "2022-08-01"
 [225] "2022-09-01" "2022-10-01" "2022-11-01" "2022-12-01" "2023-01-01" "2023-02-01" "2023-03-01" "2023-04-01"
 [233] "2023-05-01" "2023-06-01" "2023-07-01" "2023-08-01" "2023-09-01" "2023-10-01" "2023-11-01" "2023-12-01"
 [241] "2024-01-01" "2024-02-01" "2024-03-01" "2024-04-01" "2024-05-01" "2024-06-01" "2024-07-01" "2024-08-01"
 [249] "2024-09-01" "2024-10-01" "2024-11-01" "2024-12-01" "2025-01-01" "2025-02-01" "2025-03-01" "2025-04-01"
 [257] "2025-05-01" "2025-06-01" "2025-07-01" "2025-08-01" "2025-09-01" "2025-10-01" "2025-11-01" "2025-12-01"
 [265] "2026-01-01" "2026-02-01" "2026-03-01" "2026-04-01" "2026-05-01" "2026-06-01" "2026-07-01" "2026-08-01"
 [273] "2026-09-01" "2026-10-01" "2026-11-01" "2026-12-01" "2027-01-01" "2027-02-01" "2027-03-01" "2027-04-01"
 [281] "2027-05-01" "2027-06-01" "2027-07-01" "2027-08-01" "2027-09-01" "2027-10-01" "2027-11-01" "2027-12-01"
 [289] "2028-01-01" "2028-02-01" "2028-03-01" "2028-04-01" "2028-05-01" "2028-06-01" "2028-07-01" "2028-08-01"
 [297] "2028-09-01" "2028-10-01" "2028-11-01" "2028-12-01" "2029-01-01" "2029-02-01" "2029-03-01" "2029-04-01"
 [305] "2029-05-01" "2029-06-01" "2029-07-01" "2029-08-01" "2029-09-01" "2029-10-01" "2029-11-01" "2029-12-01"
 [313] "2030-01-01" "2030-02-01" "2030-03-01" "2030-04-01" "2030-05-01" "2030-06-01" "2030-07-01" "2030-08-01"
 [321] "2030-09-01" "2030-10-01" "2030-11-01" "2030-12-01" "2031-01-01" "2031-02-01" "2031-03-01" "2031-04-01"
 [329] "2031-05-01" "2031-06-01" "2031-07-01" "2031-08-01" "2031-09-01" "2031-10-01" "2031-11-01" "2031-12-01"
 [337] "2032-01-01" "2032-02-01" "2032-03-01" "2032-04-01" "2032-05-01" "2032-06-01" "2032-07-01" "2032-08-01"
 [345] "2032-09-01" "2032-10-01" "2032-11-01" "2032-12-01" "2033-01-01" "2033-02-01" "2033-03-01" "2033-04-01"
 [353] "2033-05-01" "2033-06-01" "2033-07-01" "2033-08-01" "2033-09-01" "2033-10-01" "2033-11-01" "2033-12-01"
 [361] "2034-01-01" "2034-02-01" "2034-03-01" "2034-04-01" "2034-05-01" "2034-06-01" "2034-07-01" "2034-08-01"
 [369] "2034-09-01" "2034-10-01" "2034-11-01" "2034-12-01" "2035-01-01" "2035-02-01" "2035-03-01" "2035-04-01"
 [377] "2035-05-01" "2035-06-01" "2035-07-01" "2035-08-01" "2035-09-01" "2035-10-01" "2035-11-01" "2035-12-01"
 [385] "2036-01-01" "2036-02-01" "2036-03-01" "2036-04-01" "2036-05-01" "2036-06-01" "2036-07-01" "2036-08-01"
 [393] "2036-09-01" "2036-10-01" "2036-11-01" "2036-12-01" "2037-01-01" "2037-02-01" "2037-03-01" "2037-04-01"
 [401] "2037-05-01" "2037-06-01" "2037-07-01" "2037-08-01" "2037-09-01" "2037-10-01" "2037-11-01" "2037-12-01"
 [409] "2038-01-01" "2038-02-01" "2038-03-01" "2038-04-01" "2038-05-01" "2038-06-01" "2038-07-01" "2038-08-01"
 [417] "2038-09-01" "2038-10-01" "2038-11-01" "2038-12-01" "2039-01-01" "2039-02-01" "2039-03-01" "2039-04-01"
 [425] "2039-05-01" "2039-06-01" "2039-07-01" "2039-08-01" "2039-09-01" "2039-10-01" "2039-11-01" "2039-12-01"
 [433] "2040-01-01" "2040-02-01" "2040-03-01" "2040-04-01" "2040-05-01" "2040-06-01" "2040-07-01" "2040-08-01"
 [441] "2040-09-01" "2040-10-01" "2040-11-01" "2040-12-01" "2041-01-01" "2041-02-01" "2041-03-01" "2041-04-01"
 [449] "2041-05-01" "2041-06-01" "2041-07-01" "2041-08-01" "2041-09-01" "2041-10-01" "2041-11-01" "2041-12-01"
 [457] "2042-01-01" "2042-02-01" "2042-03-01" "2042-04-01" "2042-05-01" "2042-06-01" "2042-07-01" "2042-08-01"
 [465] "2042-09-01" "2042-10-01" "2042-11-01" "2042-12-01" "2043-01-01" "2043-02-01" "2043-03-01" "2043-04-01"
 [473] "2043-05-01" "2043-06-01" "2043-07-01" "2043-08-01" "2043-09-01" "2043-10-01" "2043-11-01" "2043-12-01"
 [481] "2044-01-01" "2044-02-01" "2044-03-01" "2044-04-01" "2044-05-01" "2044-06-01" "2044-07-01" "2044-08-01"
 [489] "2044-09-01" "2044-10-01" "2044-11-01" "2044-12-01" "2045-01-01" "2045-02-01" "2045-03-01" "2045-04-01"
 [497] "2045-05-01" "2045-06-01" "2045-07-01" "2045-08-01" "2045-09-01" "2045-10-01" "2045-11-01" "2045-12-01"
 [505] "2046-01-01" "2046-02-01" "2046-03-01" "2046-04-01" "2046-05-01" "2046-06-01" "2046-07-01" "2046-08-01"
 [513] "2046-09-01" "2046-10-01" "2046-11-01" "2046-12-01" "2047-01-01" "2047-02-01" "2047-03-01" "2047-04-01"
 [521] "2047-05-01" "2047-06-01" "2047-07-01" "2047-08-01" "2047-09-01" "2047-10-01" "2047-11-01" "2047-12-01"
 [529] "2048-01-01" "2048-02-01" "2048-03-01" "2048-04-01" "2048-05-01" "2048-06-01" "2048-07-01" "2048-08-01"
 [537] "2048-09-01" "2048-10-01" "2048-11-01" "2048-12-01" "2049-01-01" "2049-02-01" "2049-03-01" "2049-04-01"
 [545] "2049-05-01" "2049-06-01" "2049-07-01" "2049-08-01" "2049-09-01" "2049-10-01" "2049-11-01" "2049-12-01"
 [553] "2050-01-01" "2050-02-01" "2050-03-01" "2050-04-01" "2050-05-01" "2050-06-01" "2050-07-01" "2050-08-01"
 [561] "2050-09-01" "2050-10-01" "2050-11-01" "2050-12-01" "2051-01-01" "2051-02-01" "2051-03-01" "2051-04-01"
 [569] "2051-05-01" "2051-06-01" "2051-07-01" "2051-08-01" "2051-09-01" "2051-10-01" "2051-11-01" "2051-12-01"
 [577] "2052-01-01" "2052-02-01" "2052-03-01" "2052-04-01" "2052-05-01" "2052-06-01" "2052-07-01" "2052-08-01"
 [585] "2052-09-01" "2052-10-01" "2052-11-01" "2052-12-01" "2053-01-01" "2053-02-01" "2053-03-01" "2053-04-01"
 [593] "2053-05-01" "2053-06-01" "2053-07-01" "2053-08-01" "2053-09-01" "2053-10-01" "2053-11-01" "2053-12-01"
 [601] "2054-01-01" "2054-02-01" "2054-03-01" "2054-04-01" "2054-05-01" "2054-06-01" "2054-07-01" "2054-08-01"
 [609] "2054-09-01" "2054-10-01" "2054-11-01" "2054-12-01" "2055-01-01" "2055-02-01" "2055-03-01" "2055-04-01"
 [617] "2055-05-01" "2055-06-01" "2055-07-01" "2055-08-01" "2055-09-01" "2055-10-01" "2055-11-01" "2055-12-01"
 [625] "2056-01-01" "2056-02-01" "2056-03-01" "2056-04-01" "2056-05-01" "2056-06-01" "2056-07-01" "2056-08-01"
 [633] "2056-09-01" "2056-10-01" "2056-11-01" "2056-12-01" "2057-01-01" "2057-02-01" "2057-03-01" "2057-04-01"
 [641] "2057-05-01" "2057-06-01" "2057-07-01" "2057-08-01" "2057-09-01" "2057-10-01" "2057-11-01" "2057-12-01"
 [649] "2058-01-01" "2058-02-01" "2058-03-01" "2058-04-01" "2058-05-01" "2058-06-01" "2058-07-01" "2058-08-01"
 [657] "2058-09-01" "2058-10-01" "2058-11-01" "2058-12-01" "2059-01-01" "2059-02-01" "2059-03-01" "2059-04-01"
 [665] "2059-05-01" "2059-06-01" "2059-07-01" "2059-08-01" "2059-09-01" "2059-10-01" "2059-11-01" "2059-12-01"
 [673] "2060-01-01" "2060-02-01" "2060-03-01" "2060-04-01" "2060-05-01" "2060-06-01" "2060-07-01" "2060-08-01"
 [681] "2060-09-01" "2060-10-01" "2060-11-01" "2060-12-01" "2061-01-01" "2061-02-01" "2061-03-01" "2061-04-01"
 [689] "2061-05-01" "2061-06-01" "2061-07-01" "2061-08-01" "2061-09-01" "2061-10-01" "2061-11-01" "2061-12-01"
 [697] "2062-01-01" "2062-02-01" "2062-03-01" "2062-04-01" "2062-05-01" "2062-06-01" "2062-07-01" "2062-08-01"
 [705] "2062-09-01" "2062-10-01" "2062-11-01" "2062-12-01" "2063-01-01" "2063-02-01" "2063-03-01" "2063-04-01"
 [713] "2063-05-01" "2063-06-01" "2063-07-01" "2063-08-01" "2063-09-01" "2063-10-01" "2063-11-01" "2063-12-01"
 [721] "2064-01-01" "2064-02-01" "2064-03-01" "2064-04-01" "2064-05-01" "2064-06-01" "2064-07-01" "2064-08-01"
 [729] "2064-09-01" "2064-10-01" "2064-11-01" "2064-12-01" "2065-01-01" "2065-02-01" "2065-03-01" "2065-04-01"
 [737] "2065-05-01" "2065-06-01" "2065-07-01" "2065-08-01" "2065-09-01" "2065-10-01" "2065-11-01" "2065-12-01"
 [745] "2066-01-01" "2066-02-01" "2066-03-01" "2066-04-01" "2066-05-01" "2066-06-01" "2066-07-01" "2066-08-01"
 [753] "2066-09-01" "2066-10-01" "2066-11-01" "2066-12-01" "2067-01-01" "2067-02-01" "2067-03-01" "2067-04-01"
 [761] "2067-05-01" "2067-06-01" "2067-07-01" "2067-08-01" "2067-09-01" "2067-10-01" "2067-11-01" "2067-12-01"
 [769] "2068-01-01" "2068-02-01" "2068-03-01" "2068-04-01" "2068-05-01" "2068-06-01" "2068-07-01" "2068-08-01"
 [777] "2068-09-01" "2068-10-01" "2068-11-01" "2068-12-01" "2069-01-01" "2069-02-01" "2069-03-01" "2069-04-01"
 [785] "2069-05-01" "2069-06-01" "2069-07-01" "2069-08-01" "2069-09-01" "2069-10-01" "2069-11-01" "2069-12-01"
 [793] "2070-01-01" "2070-02-01" "2070-03-01" "2070-04-01" "2070-05-01" "2070-06-01" "2070-07-01" "2070-08-01"
 [801] "2070-09-01" "2070-10-01" "2070-11-01" "2070-12-01" "2071-01-01" "2071-02-01" "2071-03-01" "2071-04-01"
 [809] "2071-05-01" "2071-06-01" "2071-07-01" "2071-08-01" "2071-09-01" "2071-10-01" "2071-11-01" "2071-12-01"
 [817] "2072-01-01" "2072-02-01" "2072-03-01" "2072-04-01" "2072-05-01" "2072-06-01" "2072-07-01" "2072-08-01"
 [825] "2072-09-01" "2072-10-01" "2072-11-01" "2072-12-01" "2073-01-01" "2073-02-01" "2073-03-01" "2073-04-01"
 [833] "2073-05-01" "2073-06-01" "2073-07-01" "2073-08-01" "2073-09-01" "2073-10-01" "2073-11-01" "2073-12-01"
 [841] "2074-01-01" "2074-02-01" "2074-03-01" "2074-04-01" "2074-05-01" "2074-06-01" "2074-07-01" "2074-08-01"
 [849] "2074-09-01" "2074-10-01" "2074-11-01" "2074-12-01" "2075-01-01" "2075-02-01" "2075-03-01" "2075-04-01"
 [857] "2075-05-01" "2075-06-01" "2075-07-01" "2075-08-01" "2075-09-01" "2075-10-01" "2075-11-01" "2075-12-01"
 [865] "2076-01-01" "2076-02-01" "2076-03-01" "2076-04-01" "2076-05-01" "2076-06-01" "2076-07-01" "2076-08-01"
 [873] "2076-09-01" "2076-10-01" "2076-11-01" "2076-12-01" "2077-01-01" "2077-02-01" "2077-03-01" "2077-04-01"
 [881] "2077-05-01" "2077-06-01" "2077-07-01" "2077-08-01" "2077-09-01" "2077-10-01" "2077-11-01" "2077-12-01"
 [889] "2078-01-01" "2078-02-01" "2078-03-01" "2078-04-01" "2078-05-01" "2078-06-01" "2078-07-01" "2078-08-01"
 [897] "2078-09-01" "2078-10-01" "2078-11-01" "2078-12-01" "2079-01-01" "2079-02-01" "2079-03-01" "2079-04-01"
 [905] "2079-05-01" "2079-06-01" "2079-07-01" "2079-08-01" "2079-09-01" "2079-10-01" "2079-11-01" "2079-12-01"
 [913] "2080-01-01" "2080-02-01" "2080-03-01" "2080-04-01" "2080-05-01" "2080-06-01" "2080-07-01" "2080-08-01"
 [921] "2080-09-01" "2080-10-01" "2080-11-01" "2080-12-01" "2081-01-01" "2081-02-01" "2081-03-01" "2081-04-01"
 [929] "2081-05-01" "2081-06-01" "2081-07-01" "2081-08-01" "2081-09-01" "2081-10-01" "2081-11-01" "2081-12-01"
 [937] "2082-01-01" "2082-02-01" "2082-03-01" "2082-04-01" "2082-05-01" "2082-06-01" "2082-07-01" "2082-08-01"
 [945] "2082-09-01" "2082-10-01" "2082-11-01" "2082-12-01" "2083-01-01" "2083-02-01" "2083-03-01" "2083-04-01"
 [953] "2083-05-01" "2083-06-01" "2083-07-01" "2083-08-01" "2083-09-01" "2083-10-01" "2083-11-01" "2083-12-01"
 [961] "2084-01-01" "2084-02-01" "2084-03-01" "2084-04-01" "2084-05-01" "2084-06-01" "2084-07-01" "2084-08-01"
 [969] "2084-09-01" "2084-10-01" "2084-11-01" "2084-12-01" "2085-01-01" "2085-02-01" "2085-03-01" "2085-04-01"
 [977] "2085-05-01" "2085-06-01" "2085-07-01" "2085-08-01" "2085-09-01" "2085-10-01" "2085-11-01" "2085-12-01"
 [985] "2086-01-01" "2086-02-01" "2086-03-01" "2086-04-01" "2086-05-01" "2086-06-01" "2086-07-01" "2086-08-01"
 [993] "2086-09-01" "2086-10-01" "2086-11-01" "2086-12-01" "2087-01-01" "2087-02-01" "2087-03-01" "2087-04-01"
 [ reached getOption("max.print") -- omitted 164 entries ]
time <-as.Date(time)
out <- as.matrix(YF45_out_response)         ## convert from coda to matrix

code from AMW for splitting up this matrix

x_cols <- grep('^x', colnames(out))
obs_cols <- grep('^OBS', colnames(out))

out_x <- out[,x_cols]
out_obs <- out[,obs_cols]

rm(out)

out_x <- t(out_x)

out_x <- as.data.frame(out_x)
out_x2 <- out_x |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*x\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(low = quantile(val, probs = 0.025),
                   med = median(val),
                   high = quantile(val, probs = 0.975))
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
timesteps <- as.data.frame(time)
timesteps$ind <- as.character(seq(from = 1, to = nrow(timesteps), by = 1))
colnames(timesteps) <- c('time', 'timestep')

ponds <- as.data.frame(colnames(YF_WaterTemp45[-1]))
ponds$ind <- as.character(seq(from = 1, to = nrow(ponds), by = 1))
colnames(ponds) <- c('pond_name', 'pond')

out_x_mapped <- out_x2 |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond') |>
  dplyr::select(low, med, high, time, pond_name)
Adding missing grouping variables: `pond`
pX <- out_x_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = med)) +
  ggplot2::geom_ribbon(ggplot2::aes(x = time, ymin = low, ymax = high)) +
  ggplot2::facet_wrap(~pond_name)

out_obs <- t(out_obs)

out_obs <- as.data.frame(out_obs)

out_obs2 <- out_obs |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*OBS\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(low = quantile(val, probs = 0.025),
                   med = median(val),
                   high = quantile(val, probs = 0.975))
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
out_obs_mapped <- out_obs2 |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond') |>
  dplyr::select(low, med, high, time, pond_name)
Adding missing grouping variables: `pond`
pOBS <- out_obs_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = med)) +
  ggplot2::geom_ribbon(ggplot2::aes(x = time, ymin = low, ymax = high)) +
  ggplot2::facet_wrap(~pond_name)

cowplot::plot_grid(pX, pOBS)

Probability of Crossing Threshold

threshold_probs <- out_obs |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*OBS\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(n_iter = dplyr::n(),
                   n_thresh = sum(val > 20),
                   prob = (n_thresh / n_iter) * 100)
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
threshold_probs_mapped <- threshold_probs |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond')

threshold_probs_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = prob)) +
  ggplot2::facet_wrap(~pond_name)

Save these ouputs using a .RDataFile type

save.image(file = "Corr_PooledMod_YF45.RData")
rsession-arm64(36058) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
#Currently this has all the information in it. Eventually could limit this to be just the relavent information for the remaining code below

Making Graphs

Load in this file here as long as no code changes are needed above

Creating some nice plots of these

  1. colored panel plot (each ponds forecast with the median, high, and low plus a trend line)
# set up the colors here for the plots below so that each pond has the same color each time
Mod_YF45 <- out_obs_mapped
str(Mod_YF45)
gropd_df [12,804 × 6] (S3: grouped_df/tbl_df/tbl/data.frame)
 $ pond     : chr [1:12804] "1" "1" "1" "1" ...
 $ low      : Named num [1:12804] -5.97 6.62 -1.49 6.18 8.22 ...
  ..- attr(*, "names")= chr [1:12804] "2.5%" "2.5%" "2.5%" "2.5%" ...
 $ med      : num [1:12804] 0.204 6.62 2.274 9.797 11.398 ...
 $ high     : Named num [1:12804] 6.49 6.62 5.85 13.45 14.68 ...
  ..- attr(*, "names")= chr [1:12804] "97.5%" "97.5%" "97.5%" "97.5%" ...
 $ time     : Date[1:12804], format: "2012-01-01" "2012-10-01" "2012-04-01" "2087-04-01" ...
 $ pond_name: chr [1:12804] "MP1" "MP1" "MP1" "MP1" ...
 - attr(*, "groups")= tibble [11 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ pond : chr [1:11] "1" "10" "11" "2" ...
  ..$ .rows: list<int> [1:11] 
  .. ..$ : int [1:1164] 1 2 3 4 5 6 7 8 9 10 ...
  .. ..$ : int [1:1164] 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 ...
  .. ..$ : int [1:1164] 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 ...
  .. ..$ : int [1:1164] 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 ...
  .. ..$ : int [1:1164] 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 ...
  .. ..$ : int [1:1164] 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 ...
  .. ..$ : int [1:1164] 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 ...
  .. ..$ : int [1:1164] 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 ...
  .. ..$ : int [1:1164] 9313 9314 9315 9316 9317 9318 9319 9320 9321 9322 ...
  .. ..$ : int [1:1164] 10477 10478 10479 10480 10481 10482 10483 10484 10485 10486 ...
  .. ..$ : int [1:1164] 11641 11642 11643 11644 11645 11646 11647 11648 11649 11650 ...
  .. ..@ ptype: int(0) 
  ..- attr(*, ".drop")= logi TRUE
write.csv(Mod_YF45, "Mod_YF45.csv")

# Define the custom color palette
YF_colors <- c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33", "#A65628", "#F781BF", "lightblue", "lightgreen", "#6A3D9A")

# Ensure that YF_colors has the same length as the number of unique ponds
unique_ponds <- unique(Mod_YF45$pond_name)
if (length(YF_colors) != length(unique_ponds)) {
  stop("The number of colors in YF_colors does not match the number of unique ponds.")
}

# Create a named vector for YF_colors with pond names
color_mapping <- setNames(YF_colors, unique_ponds)

# Plotting
Ponds_YF45 <- ggplot(data = Mod_YF45, aes(x = time)) +
  geom_ribbon(aes(ymin = low, ymax = high, fill = pond_name)) +  # Add the ribbon with colors
  geom_line(aes(y = med, color = pond_name)) +  # Ensure lines are visible and colored by pond
  geom_smooth(aes(y = med, color = "grey"), size = 1) +  # Ensure lines are visible and colored by pond
  geom_vline(xintercept = as.Date("2020-12-01"), linetype = "dashed", color = "red") +  # Add vertical dashed red line
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_color_manual(values = color_mapping) +  # Use custom colors for lines
  scale_fill_manual(values = color_mapping) +   # Use custom colors for ribbons
  xlab("Year") +
  ylab("Water Temperature (°C)") +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 24),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
rsession-arm64(36194) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
Ponds_YF45
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
ggsave("Corr_IndPonds_YF45.png", plot = Ponds_YF45, width = 8, height = 6)
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

  1. Trend by pond (geom smooth for each pond on the same plot for comparison)
# using the same aestetics as above

Trends_YF45 <- ggplot(data = Mod_YF45, aes(x = time)) +
  geom_smooth(aes(y = med, color = pond_name, fill = pond_name), alpha = 0.15, size = 1) +  # Smooth lines with colors by pond_name
  scale_color_manual(values = color_mapping) +
  scale_fill_manual(values = color_mapping) +   # Use custom colors for ribbons
  labs(
       x = "Year",
       y = "Water Temperature (°C)",
       color = "Pond Name",
       fill = "Pond Name") +  # Labels for legend
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 18),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        legend.position = "right",
        legend.text = element_text(size = 16), # Change the legend text size here
        legend.title = element_text(size = 20))
Trends_YF45
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
rsession-arm64(36196) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
ggsave("Corr_IndTrends_YF45.png", plot = Trends_YF45, width = 9, height = 6)
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

  1. probability plot (by pond)
probs_YF45 <- threshold_probs_mapped
write.csv(probs_YF45, "probs_YF45.csv")
rsession-arm64(36199) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
Probs20_YF45 <- ggplot(data = probs_YF45, aes(x = time)) +
  geom_line(aes(y = prob, color = pond_name)) +  # Ensure lines are visible and colored by pond
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_color_manual(values = color_mapping) +  # Use custom colors for lines
  xlab("Year") +
  ylab("Probability") +
  xlim(as.Date(c("2020-12-01", "2099-12-01"))) +
  ylim(0,100) +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 24),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
Probs20_YF45
Warning: Removed 2365 rows containing missing values or values outside the scale range (`geom_line()`).
ggsave("Corr_Probs20_YF45.png", plot = Probs20_YF45, width = 10, height = 6)
Warning: Removed 2365 rows containing missing values or values outside the scale range (`geom_line()`).

  1. Model fits by pond
Mod_YF45
rsession-arm64(36204) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
ModObs <- Mod_YF45 %>%
  filter(time < "2021-01-01")
range(ModObs$time)
[1] "2012-01-01" "2020-12-01"
ErrorPlot_YF45 <- ggplot(data = ModObs, aes(x = time)) +
  geom_ribbon(aes(ymin = low, ymax = high, fill = pond_name)) +  # Adjust fill colors
  geom_line(aes(y = med), color = "black") +  # Black lines for the median values
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_fill_manual(values = color_mapping) +  # Apply custom color palette for ribbons
  labs(
       x = "Year",
       y = "Water Temperature (°C)",
       color = "Pond Name",
       fill = "Pond Name") +  # Labels for legend
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5),
    axis.title = element_text(size = 22),
    axis.text = element_text(size = 20),
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "none" # Angle x-axis labels if needed
  )
ErrorPlot_YF45

ggsave("Corr_Error_YF45.png", plot = ErrorPlot_YF45, width = 9, height = 6)

Clear out the environment and reload the basics before starting the next section

rm(list = ls())

library(tidyverse)
library(rjags)
library(ggplot2)

set.seed(1)

RCP 8.5

Design the Model

Read in the data here, which is an output of XX code file

Then separate the data into air and water temperature files

# Air and water temperature data: YF location, 4.5 scenario
YF_Temps <- read.csv("YF_85SNAPForecast_MonCorr.csv", header=TRUE)

# Air temperature variables
YF_AirTemp85 <- YF_Temps %>%
  select(date, Airport, Air_MonthAvg, std, precision, Region)

# Water temperature variables
YF_WaterTemp85 <- YF_Temps %>%
  select(date, MP1, MP3, MP5, MP8, PL1, PL2, PL3, UBP1, UBP2, UBP3, UBP4)


# Set up a string of all the dates
time <- YF_WaterTemp85$date
length(time)
[1] 1164

Setting up the random walk model

dlm_pooled <- "
model{
#### Priors
for(p in 1:np){
x[1,p] ~ dnorm(x_ic, tau_ic) # Initial condition of water temperature
}
tau_obs ~ dgamma(a_obs, r_obs) # Prior on observation error
tau_add ~ dgamma(a_add, r_add) # Prior on process error

#### Fixed Effects
beta ~ dmnorm(mu_beta, tau_beta) # Prior on beta coefficients

for(p in 1:np){
int[p] ~ dnorm(mu_int, tau_int) # Prior on pond-specific intercepts
}

#### Data Model
for(t in 1:n){ # loop over all time steps
for(p in 1:np){
OBS[t,p] ~ dnorm(x[t,p], tau_obs) # Observed water temperature is drawn from latent air temperature with observation uncertainty
}
Xf[t] ~ dnorm(muAirTemp[t], tauAirTemp[t]) # Latent air temperature is drawn from mean and precision of forecasated air temperature
}

#### Process Model
for(t in 2:n){ # loop over all time steps except teh first (we defined ic above)
for(p in 1:np){
mu[t,p] <- x[t-1,p] + int[p] + beta[1] * x[t-1,p] + beta[2] * Xf[t] # Mean water temperature is a function of the previous time step and current air temperature
x[t,p] ~ dnorm(mu[t,p], tau_add) # Latent water temperature is drawn from mean water temperature with process uncertainty
}
}
}
"

Define the data and priors for the model

# Empty list
data <- list()
# Water temperature observations
data$OBS <- dplyr::select(YF_WaterTemp85, -date)
# Number of time steps
data$n <- nrow(data$OBS)
# Number of ponds
data$np <- ncol(data$OBS)
# Initial water temperature mean
data$x_ic <- 0.1
# Initial water temperature precision
data$tau_ic = 0.1
# Prior parameters for observation and process uncertainty
data$a_obs = 1
data$r_obs = 1
data$a_add = 1
data$r_add = 1
# Prior parameters for beta coefficients
data$mu_beta <- c(0, 0)
data$tau_beta <- diag(x = c(0.001, 0.001), nrow = 2, ncol = 2)
# Prior parameters for intercept
data$mu_int <- 0
data$tau_int <- 0.001
# Mean air temperature estimate
data$muAirTemp <- YF_AirTemp85$Air_MonthAvg
# Air temperature precision
data$tauAirTemp <- YF_AirTemp85$precision

Create JAGS model with 3 chains

jm <- jags.model(file = textConnection(dlm_pooled), data = data, n.chains = 3)
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 456
   Unobserved stochastic nodes: 26330
   Total graph size: 55883

Initializing model
rsession-arm64(36209) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.

Posterior samples of parameters

YF85_out_params <- coda.samples(model = jm,
                               variable.names = c('beta', 'int',
                                                  'tau_add', 'tau_obs'),
                               n.iter = 50000, thin = 25)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Posterior samples of response variables

rsession-arm64(36230) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
YF85_out_response <- coda.samples(model = jm,
                                 variable.names = c('x', 'OBS'),
                                 n.iter = 100000, thin = 25)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

A couple quick checks here

# plot(YF85_out_params)
gelman.diag(YF85_out_params, confidence = 0.99)
Potential scale reduction factors:

        Point est. Upper C.I.
beta[1]       1.01       1.05
beta[2]       1.00       1.02
int[1]        1.00       1.02
int[2]        1.00       1.02
int[3]        1.00       1.02
int[4]        1.01       1.02
int[5]        1.01       1.03
int[6]        1.00       1.01
int[7]        1.00       1.01
int[8]        1.01       1.02
int[9]        1.00       1.02
int[10]       1.00       1.02
int[11]       1.00       1.01
tau_add       1.00       1.00
tau_obs       1.00       1.00

Multivariate psrf

1.01

Visualize the output by just looking at the 95% Credible interval of the time-series of X’s and compare that to the observed Y’s

Transform the samples back from the log domain to the linear domain

time                               ## adjust to zoom in and out
   [1] "2012-01-01" "2012-02-01" "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01" "2012-07-01" "2012-08-01"
   [9] "2012-09-01" "2012-10-01" "2012-11-01" "2012-12-01" "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01"
  [17] "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01" "2013-10-01" "2013-11-01" "2013-12-01"
  [25] "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01" "2014-05-01" "2014-06-01" "2014-07-01" "2014-08-01"
  [33] "2014-09-01" "2014-10-01" "2014-11-01" "2014-12-01" "2015-01-01" "2015-02-01" "2015-03-01" "2015-04-01"
  [41] "2015-05-01" "2015-06-01" "2015-07-01" "2015-08-01" "2015-09-01" "2015-10-01" "2015-11-01" "2015-12-01"
  [49] "2016-01-01" "2016-02-01" "2016-03-01" "2016-04-01" "2016-05-01" "2016-06-01" "2016-07-01" "2016-08-01"
  [57] "2016-09-01" "2016-10-01" "2016-11-01" "2016-12-01" "2017-01-01" "2017-02-01" "2017-03-01" "2017-04-01"
  [65] "2017-05-01" "2017-06-01" "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01" "2017-11-01" "2017-12-01"
  [73] "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" "2018-05-01" "2018-06-01" "2018-07-01" "2018-08-01"
  [81] "2018-09-01" "2018-10-01" "2018-11-01" "2018-12-01" "2019-01-01" "2019-02-01" "2019-03-01" "2019-04-01"
  [89] "2019-05-01" "2019-06-01" "2019-07-01" "2019-08-01" "2019-09-01" "2019-10-01" "2019-11-01" "2019-12-01"
  [97] "2012-01-01" "2012-02-01" "2012-03-01" "2012-04-01" "2012-05-01" "2012-06-01" "2012-07-01" "2012-08-01"
 [105] "2012-09-01" "2012-10-01" "2012-11-01" "2012-12-01" "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-01"
 [113] "2013-05-01" "2013-06-01" "2013-07-01" "2013-08-01" "2013-09-01" "2013-10-01" "2013-11-01" "2013-12-01"
 [121] "2014-01-01" "2014-02-01" "2014-03-01" "2014-04-01" "2014-05-01" "2014-06-01" "2014-07-01" "2014-08-01"
 [129] "2014-09-01" "2014-10-01" "2014-11-01" "2014-12-01" "2015-01-01" "2015-02-01" "2015-03-01" "2015-04-01"
 [137] "2015-05-01" "2015-06-01" "2015-07-01" "2015-08-01" "2015-09-01" "2015-10-01" "2015-11-01" "2015-12-01"
 [145] "2016-01-01" "2016-02-01" "2016-03-01" "2016-04-01" "2016-05-01" "2016-06-01" "2016-07-01" "2016-08-01"
 [153] "2016-09-01" "2016-10-01" "2016-11-01" "2016-12-01" "2017-01-01" "2017-02-01" "2017-03-01" "2017-04-01"
 [161] "2017-05-01" "2017-06-01" "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01" "2017-11-01" "2017-12-01"
 [169] "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" "2018-05-01" "2018-06-01" "2018-07-01" "2018-08-01"
 [177] "2018-09-01" "2018-10-01" "2018-11-01" "2018-12-01" "2019-01-01" "2019-02-01" "2019-03-01" "2019-04-01"
 [185] "2019-05-01" "2019-06-01" "2019-07-01" "2019-08-01" "2019-09-01" "2019-10-01" "2019-11-01" "2019-12-01"
 [193] "2020-01-01" "2020-02-01" "2020-03-01" "2020-04-01" "2020-05-01" "2020-06-01" "2020-07-01" "2020-08-01"
 [201] "2020-09-01" "2020-10-01" "2020-11-01" "2020-12-01" "2021-01-01" "2021-02-01" "2021-03-01" "2021-04-01"
 [209] "2021-05-01" "2021-06-01" "2021-07-01" "2021-08-01" "2021-09-01" "2021-10-01" "2021-11-01" "2021-12-01"
 [217] "2022-01-01" "2022-02-01" "2022-03-01" "2022-04-01" "2022-05-01" "2022-06-01" "2022-07-01" "2022-08-01"
 [225] "2022-09-01" "2022-10-01" "2022-11-01" "2022-12-01" "2023-01-01" "2023-02-01" "2023-03-01" "2023-04-01"
 [233] "2023-05-01" "2023-06-01" "2023-07-01" "2023-08-01" "2023-09-01" "2023-10-01" "2023-11-01" "2023-12-01"
 [241] "2024-01-01" "2024-02-01" "2024-03-01" "2024-04-01" "2024-05-01" "2024-06-01" "2024-07-01" "2024-08-01"
 [249] "2024-09-01" "2024-10-01" "2024-11-01" "2024-12-01" "2025-01-01" "2025-02-01" "2025-03-01" "2025-04-01"
 [257] "2025-05-01" "2025-06-01" "2025-07-01" "2025-08-01" "2025-09-01" "2025-10-01" "2025-11-01" "2025-12-01"
 [265] "2026-01-01" "2026-02-01" "2026-03-01" "2026-04-01" "2026-05-01" "2026-06-01" "2026-07-01" "2026-08-01"
 [273] "2026-09-01" "2026-10-01" "2026-11-01" "2026-12-01" "2027-01-01" "2027-02-01" "2027-03-01" "2027-04-01"
 [281] "2027-05-01" "2027-06-01" "2027-07-01" "2027-08-01" "2027-09-01" "2027-10-01" "2027-11-01" "2027-12-01"
 [289] "2028-01-01" "2028-02-01" "2028-03-01" "2028-04-01" "2028-05-01" "2028-06-01" "2028-07-01" "2028-08-01"
 [297] "2028-09-01" "2028-10-01" "2028-11-01" "2028-12-01" "2029-01-01" "2029-02-01" "2029-03-01" "2029-04-01"
 [305] "2029-05-01" "2029-06-01" "2029-07-01" "2029-08-01" "2029-09-01" "2029-10-01" "2029-11-01" "2029-12-01"
 [313] "2030-01-01" "2030-02-01" "2030-03-01" "2030-04-01" "2030-05-01" "2030-06-01" "2030-07-01" "2030-08-01"
 [321] "2030-09-01" "2030-10-01" "2030-11-01" "2030-12-01" "2031-01-01" "2031-02-01" "2031-03-01" "2031-04-01"
 [329] "2031-05-01" "2031-06-01" "2031-07-01" "2031-08-01" "2031-09-01" "2031-10-01" "2031-11-01" "2031-12-01"
 [337] "2032-01-01" "2032-02-01" "2032-03-01" "2032-04-01" "2032-05-01" "2032-06-01" "2032-07-01" "2032-08-01"
 [345] "2032-09-01" "2032-10-01" "2032-11-01" "2032-12-01" "2033-01-01" "2033-02-01" "2033-03-01" "2033-04-01"
 [353] "2033-05-01" "2033-06-01" "2033-07-01" "2033-08-01" "2033-09-01" "2033-10-01" "2033-11-01" "2033-12-01"
 [361] "2034-01-01" "2034-02-01" "2034-03-01" "2034-04-01" "2034-05-01" "2034-06-01" "2034-07-01" "2034-08-01"
 [369] "2034-09-01" "2034-10-01" "2034-11-01" "2034-12-01" "2035-01-01" "2035-02-01" "2035-03-01" "2035-04-01"
 [377] "2035-05-01" "2035-06-01" "2035-07-01" "2035-08-01" "2035-09-01" "2035-10-01" "2035-11-01" "2035-12-01"
 [385] "2036-01-01" "2036-02-01" "2036-03-01" "2036-04-01" "2036-05-01" "2036-06-01" "2036-07-01" "2036-08-01"
 [393] "2036-09-01" "2036-10-01" "2036-11-01" "2036-12-01" "2037-01-01" "2037-02-01" "2037-03-01" "2037-04-01"
 [401] "2037-05-01" "2037-06-01" "2037-07-01" "2037-08-01" "2037-09-01" "2037-10-01" "2037-11-01" "2037-12-01"
 [409] "2038-01-01" "2038-02-01" "2038-03-01" "2038-04-01" "2038-05-01" "2038-06-01" "2038-07-01" "2038-08-01"
 [417] "2038-09-01" "2038-10-01" "2038-11-01" "2038-12-01" "2039-01-01" "2039-02-01" "2039-03-01" "2039-04-01"
 [425] "2039-05-01" "2039-06-01" "2039-07-01" "2039-08-01" "2039-09-01" "2039-10-01" "2039-11-01" "2039-12-01"
 [433] "2040-01-01" "2040-02-01" "2040-03-01" "2040-04-01" "2040-05-01" "2040-06-01" "2040-07-01" "2040-08-01"
 [441] "2040-09-01" "2040-10-01" "2040-11-01" "2040-12-01" "2041-01-01" "2041-02-01" "2041-03-01" "2041-04-01"
 [449] "2041-05-01" "2041-06-01" "2041-07-01" "2041-08-01" "2041-09-01" "2041-10-01" "2041-11-01" "2041-12-01"
 [457] "2042-01-01" "2042-02-01" "2042-03-01" "2042-04-01" "2042-05-01" "2042-06-01" "2042-07-01" "2042-08-01"
 [465] "2042-09-01" "2042-10-01" "2042-11-01" "2042-12-01" "2043-01-01" "2043-02-01" "2043-03-01" "2043-04-01"
 [473] "2043-05-01" "2043-06-01" "2043-07-01" "2043-08-01" "2043-09-01" "2043-10-01" "2043-11-01" "2043-12-01"
 [481] "2044-01-01" "2044-02-01" "2044-03-01" "2044-04-01" "2044-05-01" "2044-06-01" "2044-07-01" "2044-08-01"
 [489] "2044-09-01" "2044-10-01" "2044-11-01" "2044-12-01" "2045-01-01" "2045-02-01" "2045-03-01" "2045-04-01"
 [497] "2045-05-01" "2045-06-01" "2045-07-01" "2045-08-01" "2045-09-01" "2045-10-01" "2045-11-01" "2045-12-01"
 [505] "2046-01-01" "2046-02-01" "2046-03-01" "2046-04-01" "2046-05-01" "2046-06-01" "2046-07-01" "2046-08-01"
 [513] "2046-09-01" "2046-10-01" "2046-11-01" "2046-12-01" "2047-01-01" "2047-02-01" "2047-03-01" "2047-04-01"
 [521] "2047-05-01" "2047-06-01" "2047-07-01" "2047-08-01" "2047-09-01" "2047-10-01" "2047-11-01" "2047-12-01"
 [529] "2048-01-01" "2048-02-01" "2048-03-01" "2048-04-01" "2048-05-01" "2048-06-01" "2048-07-01" "2048-08-01"
 [537] "2048-09-01" "2048-10-01" "2048-11-01" "2048-12-01" "2049-01-01" "2049-02-01" "2049-03-01" "2049-04-01"
 [545] "2049-05-01" "2049-06-01" "2049-07-01" "2049-08-01" "2049-09-01" "2049-10-01" "2049-11-01" "2049-12-01"
 [553] "2050-01-01" "2050-02-01" "2050-03-01" "2050-04-01" "2050-05-01" "2050-06-01" "2050-07-01" "2050-08-01"
 [561] "2050-09-01" "2050-10-01" "2050-11-01" "2050-12-01" "2051-01-01" "2051-02-01" "2051-03-01" "2051-04-01"
 [569] "2051-05-01" "2051-06-01" "2051-07-01" "2051-08-01" "2051-09-01" "2051-10-01" "2051-11-01" "2051-12-01"
 [577] "2052-01-01" "2052-02-01" "2052-03-01" "2052-04-01" "2052-05-01" "2052-06-01" "2052-07-01" "2052-08-01"
 [585] "2052-09-01" "2052-10-01" "2052-11-01" "2052-12-01" "2053-01-01" "2053-02-01" "2053-03-01" "2053-04-01"
 [593] "2053-05-01" "2053-06-01" "2053-07-01" "2053-08-01" "2053-09-01" "2053-10-01" "2053-11-01" "2053-12-01"
 [601] "2054-01-01" "2054-02-01" "2054-03-01" "2054-04-01" "2054-05-01" "2054-06-01" "2054-07-01" "2054-08-01"
 [609] "2054-09-01" "2054-10-01" "2054-11-01" "2054-12-01" "2055-01-01" "2055-02-01" "2055-03-01" "2055-04-01"
 [617] "2055-05-01" "2055-06-01" "2055-07-01" "2055-08-01" "2055-09-01" "2055-10-01" "2055-11-01" "2055-12-01"
 [625] "2056-01-01" "2056-02-01" "2056-03-01" "2056-04-01" "2056-05-01" "2056-06-01" "2056-07-01" "2056-08-01"
 [633] "2056-09-01" "2056-10-01" "2056-11-01" "2056-12-01" "2057-01-01" "2057-02-01" "2057-03-01" "2057-04-01"
 [641] "2057-05-01" "2057-06-01" "2057-07-01" "2057-08-01" "2057-09-01" "2057-10-01" "2057-11-01" "2057-12-01"
 [649] "2058-01-01" "2058-02-01" "2058-03-01" "2058-04-01" "2058-05-01" "2058-06-01" "2058-07-01" "2058-08-01"
 [657] "2058-09-01" "2058-10-01" "2058-11-01" "2058-12-01" "2059-01-01" "2059-02-01" "2059-03-01" "2059-04-01"
 [665] "2059-05-01" "2059-06-01" "2059-07-01" "2059-08-01" "2059-09-01" "2059-10-01" "2059-11-01" "2059-12-01"
 [673] "2060-01-01" "2060-02-01" "2060-03-01" "2060-04-01" "2060-05-01" "2060-06-01" "2060-07-01" "2060-08-01"
 [681] "2060-09-01" "2060-10-01" "2060-11-01" "2060-12-01" "2061-01-01" "2061-02-01" "2061-03-01" "2061-04-01"
 [689] "2061-05-01" "2061-06-01" "2061-07-01" "2061-08-01" "2061-09-01" "2061-10-01" "2061-11-01" "2061-12-01"
 [697] "2062-01-01" "2062-02-01" "2062-03-01" "2062-04-01" "2062-05-01" "2062-06-01" "2062-07-01" "2062-08-01"
 [705] "2062-09-01" "2062-10-01" "2062-11-01" "2062-12-01" "2063-01-01" "2063-02-01" "2063-03-01" "2063-04-01"
 [713] "2063-05-01" "2063-06-01" "2063-07-01" "2063-08-01" "2063-09-01" "2063-10-01" "2063-11-01" "2063-12-01"
 [721] "2064-01-01" "2064-02-01" "2064-03-01" "2064-04-01" "2064-05-01" "2064-06-01" "2064-07-01" "2064-08-01"
 [729] "2064-09-01" "2064-10-01" "2064-11-01" "2064-12-01" "2065-01-01" "2065-02-01" "2065-03-01" "2065-04-01"
 [737] "2065-05-01" "2065-06-01" "2065-07-01" "2065-08-01" "2065-09-01" "2065-10-01" "2065-11-01" "2065-12-01"
 [745] "2066-01-01" "2066-02-01" "2066-03-01" "2066-04-01" "2066-05-01" "2066-06-01" "2066-07-01" "2066-08-01"
 [753] "2066-09-01" "2066-10-01" "2066-11-01" "2066-12-01" "2067-01-01" "2067-02-01" "2067-03-01" "2067-04-01"
 [761] "2067-05-01" "2067-06-01" "2067-07-01" "2067-08-01" "2067-09-01" "2067-10-01" "2067-11-01" "2067-12-01"
 [769] "2068-01-01" "2068-02-01" "2068-03-01" "2068-04-01" "2068-05-01" "2068-06-01" "2068-07-01" "2068-08-01"
 [777] "2068-09-01" "2068-10-01" "2068-11-01" "2068-12-01" "2069-01-01" "2069-02-01" "2069-03-01" "2069-04-01"
 [785] "2069-05-01" "2069-06-01" "2069-07-01" "2069-08-01" "2069-09-01" "2069-10-01" "2069-11-01" "2069-12-01"
 [793] "2070-01-01" "2070-02-01" "2070-03-01" "2070-04-01" "2070-05-01" "2070-06-01" "2070-07-01" "2070-08-01"
 [801] "2070-09-01" "2070-10-01" "2070-11-01" "2070-12-01" "2071-01-01" "2071-02-01" "2071-03-01" "2071-04-01"
 [809] "2071-05-01" "2071-06-01" "2071-07-01" "2071-08-01" "2071-09-01" "2071-10-01" "2071-11-01" "2071-12-01"
 [817] "2072-01-01" "2072-02-01" "2072-03-01" "2072-04-01" "2072-05-01" "2072-06-01" "2072-07-01" "2072-08-01"
 [825] "2072-09-01" "2072-10-01" "2072-11-01" "2072-12-01" "2073-01-01" "2073-02-01" "2073-03-01" "2073-04-01"
 [833] "2073-05-01" "2073-06-01" "2073-07-01" "2073-08-01" "2073-09-01" "2073-10-01" "2073-11-01" "2073-12-01"
 [841] "2074-01-01" "2074-02-01" "2074-03-01" "2074-04-01" "2074-05-01" "2074-06-01" "2074-07-01" "2074-08-01"
 [849] "2074-09-01" "2074-10-01" "2074-11-01" "2074-12-01" "2075-01-01" "2075-02-01" "2075-03-01" "2075-04-01"
 [857] "2075-05-01" "2075-06-01" "2075-07-01" "2075-08-01" "2075-09-01" "2075-10-01" "2075-11-01" "2075-12-01"
 [865] "2076-01-01" "2076-02-01" "2076-03-01" "2076-04-01" "2076-05-01" "2076-06-01" "2076-07-01" "2076-08-01"
 [873] "2076-09-01" "2076-10-01" "2076-11-01" "2076-12-01" "2077-01-01" "2077-02-01" "2077-03-01" "2077-04-01"
 [881] "2077-05-01" "2077-06-01" "2077-07-01" "2077-08-01" "2077-09-01" "2077-10-01" "2077-11-01" "2077-12-01"
 [889] "2078-01-01" "2078-02-01" "2078-03-01" "2078-04-01" "2078-05-01" "2078-06-01" "2078-07-01" "2078-08-01"
 [897] "2078-09-01" "2078-10-01" "2078-11-01" "2078-12-01" "2079-01-01" "2079-02-01" "2079-03-01" "2079-04-01"
 [905] "2079-05-01" "2079-06-01" "2079-07-01" "2079-08-01" "2079-09-01" "2079-10-01" "2079-11-01" "2079-12-01"
 [913] "2080-01-01" "2080-02-01" "2080-03-01" "2080-04-01" "2080-05-01" "2080-06-01" "2080-07-01" "2080-08-01"
 [921] "2080-09-01" "2080-10-01" "2080-11-01" "2080-12-01" "2081-01-01" "2081-02-01" "2081-03-01" "2081-04-01"
 [929] "2081-05-01" "2081-06-01" "2081-07-01" "2081-08-01" "2081-09-01" "2081-10-01" "2081-11-01" "2081-12-01"
 [937] "2082-01-01" "2082-02-01" "2082-03-01" "2082-04-01" "2082-05-01" "2082-06-01" "2082-07-01" "2082-08-01"
 [945] "2082-09-01" "2082-10-01" "2082-11-01" "2082-12-01" "2083-01-01" "2083-02-01" "2083-03-01" "2083-04-01"
 [953] "2083-05-01" "2083-06-01" "2083-07-01" "2083-08-01" "2083-09-01" "2083-10-01" "2083-11-01" "2083-12-01"
 [961] "2084-01-01" "2084-02-01" "2084-03-01" "2084-04-01" "2084-05-01" "2084-06-01" "2084-07-01" "2084-08-01"
 [969] "2084-09-01" "2084-10-01" "2084-11-01" "2084-12-01" "2085-01-01" "2085-02-01" "2085-03-01" "2085-04-01"
 [977] "2085-05-01" "2085-06-01" "2085-07-01" "2085-08-01" "2085-09-01" "2085-10-01" "2085-11-01" "2085-12-01"
 [985] "2086-01-01" "2086-02-01" "2086-03-01" "2086-04-01" "2086-05-01" "2086-06-01" "2086-07-01" "2086-08-01"
 [993] "2086-09-01" "2086-10-01" "2086-11-01" "2086-12-01" "2087-01-01" "2087-02-01" "2087-03-01" "2087-04-01"
 [ reached getOption("max.print") -- omitted 164 entries ]
time <-as.Date(time)
out <- as.matrix(YF85_out_response)         ## convert from coda to matrix

code from AMW for splitting up this matrix

x_cols <- grep('^x', colnames(out))
obs_cols <- grep('^OBS', colnames(out))

out_x <- out[,x_cols]
out_obs <- out[,obs_cols]

rm(out)

out_x <- t(out_x)

out_x <- as.data.frame(out_x)
out_x2 <- out_x |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*x\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(low = quantile(val, probs = 0.025),
                   med = median(val),
                   high = quantile(val, probs = 0.975))
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
timesteps <- as.data.frame(time)
timesteps$ind <- as.character(seq(from = 1, to = nrow(timesteps), by = 1))
colnames(timesteps) <- c('time', 'timestep')

ponds <- as.data.frame(colnames(YF_WaterTemp85[-1]))
ponds$ind <- as.character(seq(from = 1, to = nrow(ponds), by = 1))
colnames(ponds) <- c('pond_name', 'pond')

out_x_mapped <- out_x2 |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond') |>
  dplyr::select(low, med, high, time, pond_name)
Adding missing grouping variables: `pond`
pX <- out_x_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = med)) +
  ggplot2::geom_ribbon(ggplot2::aes(x = time, ymin = low, ymax = high)) +
  ggplot2::facet_wrap(~pond_name)

out_obs <- t(out_obs)

out_obs <- as.data.frame(out_obs)

out_obs2 <- out_obs |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*OBS\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(low = quantile(val, probs = 0.025),
                   med = median(val),
                   high = quantile(val, probs = 0.975))
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
out_obs_mapped <- out_obs2 |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond') |>
  dplyr::select(low, med, high, time, pond_name)
Adding missing grouping variables: `pond`
pOBS <- out_obs_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = med)) +
  ggplot2::geom_ribbon(ggplot2::aes(x = time, ymin = low, ymax = high)) +
  ggplot2::facet_wrap(~pond_name)

cowplot::plot_grid(pX, pOBS)

Probability of Crossing Threshold

threshold_probs <- out_obs |>
  tibble::rownames_to_column(var = 'time_pond') |>
  dplyr::mutate(timestep = sub(x = time_pond,
                               pattern = '.*OBS\\[',
                               replacement = ''),
                timestep = sub(x = timestep,
                               pattern = ',.*',
                               replacement = ''),
                pond = sub(x = time_pond,
                           pattern = '.*,',
                           replacement = ''),
                pond = sub(x = pond,
                           pattern = '\\]',
                           replacement = '')) |>
  tidyr::pivot_longer(-c(time_pond, timestep, pond),
                      names_to = 'iter', values_to = 'val') |>
  dplyr::group_by(pond, timestep) |>
  dplyr::summarize(n_iter = dplyr::n(),
                   n_thresh = sum(val > 20),
                   prob = (n_thresh / n_iter) * 100)
`summarise()` has grouped output by 'pond'. You can override using the `.groups` argument.
threshold_probs_mapped <- threshold_probs |>
  dplyr::left_join(y = timesteps, by = 'timestep') |>
  dplyr::left_join(y = ponds, by = 'pond')

threshold_probs_mapped |>
  ggplot2::ggplot() +
  ggplot2::geom_line(ggplot2::aes(x = time, y = prob)) +
  ggplot2::facet_wrap(~pond_name)

Save these ouputs using a .RDataFile type

Making Graphs

Load in this file here as long as no code changes are needed above

Creating some nice plots of these

  1. colored panel plot (each ponds forecast with the median, high, and low plus a trend line)
# set up the colors here for the plots below so that each pond has the same color each time
Mod_YF85 <- out_obs_mapped
str(Mod_YF85)
gropd_df [12,804 × 6] (S3: grouped_df/tbl_df/tbl/data.frame)
 $ pond     : chr [1:12804] "1" "1" "1" "1" ...
 $ low      : Named num [1:12804] -6.13 6.62 -2.95 7.38 9.17 ...
  ..- attr(*, "names")= chr [1:12804] "2.5%" "2.5%" "2.5%" "2.5%" ...
 $ med      : num [1:12804] 0.175 6.62 1.28 11.309 13.347 ...
 $ high     : Named num [1:12804] 6.35 6.62 5.19 15.27 17.7 ...
  ..- attr(*, "names")= chr [1:12804] "97.5%" "97.5%" "97.5%" "97.5%" ...
 $ time     : Date[1:12804], format: "2012-01-01" "2012-10-01" "2012-04-01" "2087-04-01" ...
 $ pond_name: chr [1:12804] "MP1" "MP1" "MP1" "MP1" ...
 - attr(*, "groups")= tibble [11 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ pond : chr [1:11] "1" "10" "11" "2" ...
  ..$ .rows: list<int> [1:11] 
  .. ..$ : int [1:1164] 1 2 3 4 5 6 7 8 9 10 ...
  .. ..$ : int [1:1164] 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 ...
  .. ..$ : int [1:1164] 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 ...
  .. ..$ : int [1:1164] 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 ...
  .. ..$ : int [1:1164] 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 ...
  .. ..$ : int [1:1164] 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 ...
  .. ..$ : int [1:1164] 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 ...
  .. ..$ : int [1:1164] 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 ...
  .. ..$ : int [1:1164] 9313 9314 9315 9316 9317 9318 9319 9320 9321 9322 ...
  .. ..$ : int [1:1164] 10477 10478 10479 10480 10481 10482 10483 10484 10485 10486 ...
  .. ..$ : int [1:1164] 11641 11642 11643 11644 11645 11646 11647 11648 11649 11650 ...
  .. ..@ ptype: int(0) 
  ..- attr(*, ".drop")= logi TRUE
write.csv(Mod_YF85, "Mod_YF85.csv")

# Define the custom color palette
YF_colors <- c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33", "#A65628", "#F781BF", "lightblue", "lightgreen", "#6A3D9A")

# Ensure that YF_colors has the same length as the number of unique ponds
unique_ponds <- unique(Mod_YF85$pond_name)
if (length(YF_colors) != length(unique_ponds)) {
  stop("The number of colors in YF_colors does not match the number of unique ponds.")
}

# Create a named vector for YF_colors with pond names
color_mapping <- setNames(YF_colors, unique_ponds)

# Plotting
Ponds_YF85 <- ggplot(data = Mod_YF85, aes(x = time)) +
  geom_ribbon(aes(ymin = low, ymax = high, fill = pond_name)) +  # Add the ribbon with colors
  geom_line(aes(y = med, color = pond_name)) +  # Ensure lines are visible and colored by pond
  geom_smooth(aes(y = med, color = "grey"), size = 1) +  # Ensure lines are visible and colored by pond
  geom_vline(xintercept = as.Date("2020-12-01"), linetype = "dashed", color = "red") +  # Add vertical dashed red line
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_color_manual(values = color_mapping) +  # Use custom colors for lines
  scale_fill_manual(values = color_mapping) +   # Use custom colors for ribbons
  xlab("Year") +
  ylab("Water Temperature (°C)") +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 24),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
rsession-arm64(36847) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
Ponds_YF85
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
ggsave("Corr_IndPonds_YF85.png", plot = Ponds_YF85, width = 8, height = 6)
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

Create plots of the trend by pond (geom smooth for each pond on the same plot for comparison)

# using the same aestetics as above

Trends_YF85 <- ggplot(data = Mod_YF85, aes(x = time)) +
  geom_smooth(aes(y = med, color = pond_name, fill = pond_name), alpha = 0.15, size = 1) +  # Smooth lines with colors by pond_name
  scale_color_manual(values = color_mapping) +
  scale_fill_manual(values = color_mapping) +   # Use custom colors for ribbons
  labs(
       x = "Year",
       y = "Water Temperature (°C)",
       color = "Pond Name",
       fill = "Pond Name") +  # Labels for legend
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 18),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        legend.position = "right",
        legend.text = element_text(size = 16), # Change the legend text size here
        legend.title = element_text(size = 20))
Trends_YF85
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
ggsave("Corr_IndTrends_YF85.png", plot = Trends_YF85, width = 9, height = 6)
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
rsession-arm64(36862) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.

  1. probability plot (by pond)
probs_YF85 <- threshold_probs_mapped
write.csv(probs_YF85, "probs_YF85.csv")

Probs20_YF85 <- ggplot(data = probs_YF85, aes(x = time)) +
  geom_line(aes(y = prob, color = pond_name)) +  # Ensure lines are visible and colored by pond
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_color_manual(values = color_mapping) +  # Use custom colors for lines
  xlab("Year") +
  ylab("Probability") +
  xlim(as.Date(c("2020-12-01", "2099-12-01"))) +
  ylim(0,100) +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 24),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
Probs20_YF85
Warning: Removed 2365 rows containing missing values or values outside the scale range (`geom_line()`).
ggsave("Corr_Probs20_YF85.png", plot = Probs20_YF85, width = 9, height = 6)
rsession-arm64(36866) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.
Warning: Removed 2365 rows containing missing values or values outside the scale range (`geom_line()`).

  1. Model fits by pond
Mod_YF85

ModObs <- Mod_YF85 %>%
  filter(time < "2021-01-01")
range(ModObs$time)
[1] "2012-01-01" "2020-12-01"
ModelErrorPlot_YF85 <- ggplot(data = ModObs, aes(x = time)) +
  geom_ribbon(aes(ymin = low, ymax = high, fill = pond_name)) +  # Adjust fill colors
  geom_line(aes(y = med), color = "black") +  # Black lines for the median values
  facet_wrap(~ pond_name) +  # Facet by pond_name
  scale_fill_manual(values = color_mapping) +  # Apply custom color palette for ribbons
  labs(
       x = "Year",
       y = "Water Temperature (°C)",
       color = "Pond Name",
       fill = "Pond Name") +  # Labels for legend
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, size = 18),
        axis.title = element_text(size = 22),
        axis.text = element_text(size = 20),
        axis.text.x = element_text(angle = 65, hjust = 1),
        legend.position = "none",
        strip.text = element_text(size = 16))
ModelErrorPlot_YF85

ggsave("Corr_Error_YF85.png", plot = ModelErrorPlot_YF85, width = 9, height = 6)
rsession-arm64(36868) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.

Clear the environment

rm(list = ls())
LS0tCnRpdGxlOiAiUG9vbGVkIEZvcmVjYXN0IE1vZGVscyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKU2V0dGluZyB1cCB0aGUgUiB3b3Jrc3BhY2UKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShyamFncykKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGh5ZHJvR09GKQoKc2V0LnNlZWQoMSkKYGBgCgojIFN0YXJ0aW5nIHdpdGggdGhlIENvcHBlciBSaXZlciBEZWx0YSAoQ1JEKQoKIyMgUkNQIDQuNQoKIyMjIERlc2lnbiB0aGUgTW9kZWwKClJlYWQgaW4gdGhlIGRhdGEgaGVyZSwgd2hpY2ggaXMgYW4gb3V0cHV0IG9mIFhYIGNvZGUgZmlsZQoKVGhlbiBzZXBhcmF0ZSB0aGUgZGF0YSBpbnRvIGFpciBhbmQgd2F0ZXIgdGVtcGVyYXR1cmUgZmlsZXMKCmBgYHtyfQojIEFpciBhbmQgd2F0ZXIgdGVtcGVyYXR1cmUgZGF0YTogQ1IgbG9jYXRpb24sIDQuNSBzY2VuYXJpbwpDUl9UZW1wcyA8LSByZWFkLmNzdigiQ1JfNDVTTkFQRm9yZWNhc3RfTW9uQ29yci5jc3YiLCBoZWFkZXI9VFJVRSkKCiMgQWlyIHRlbXBlcmF0dXJlIHZhcmlhYmxlcwpDUl9BaXJUZW1wNDUgPC0gQ1JfVGVtcHMgJT4lCiAgc2VsZWN0KGRhdGUsIEFpcnBvcnQsIEFpcl9Nb250aEF2Zywgc3RkLCBwcmVjaXNpb24sIFJlZ2lvbikKCiMgV2F0ZXIgdGVtcGVyYXR1cmUgdmFyaWFibGVzCkNSX1dhdGVyVGVtcDQ1IDwtIENSX1RlbXBzICU+JQogIHNlbGVjdChkYXRlLCBCVlMsIENBQiwgVElOLCBTUVIsIENBTiwgRVlTLCBUSVMsIFdERCwgUkhNKQoKCiMgU2V0IHVwIGEgc3RyaW5nIG9mIGFsbCB0aGUgZGF0ZXMKdGltZSA8LSBDUl9XYXRlclRlbXA0NSRkYXRlCmxlbmd0aCh0aW1lKQpgYGAKClNldHRpbmcgdXAgdGhlIHJhbmRvbSB3YWxrIG1vZGVsCgpgYGB7cn0KZGxtX3Bvb2xlZCA8LSAiCm1vZGVsewojIyMjIFByaW9ycwpmb3IocCBpbiAxOm5wKXsKeFsxLHBdIH4gZG5vcm0oeF9pYywgdGF1X2ljKSAjIEluaXRpYWwgY29uZGl0aW9uIG9mIHdhdGVyIHRlbXBlcmF0dXJlCn0KdGF1X29icyB+IGRnYW1tYShhX29icywgcl9vYnMpICMgUHJpb3Igb24gb2JzZXJ2YXRpb24gZXJyb3IKdGF1X2FkZCB+IGRnYW1tYShhX2FkZCwgcl9hZGQpICMgUHJpb3Igb24gcHJvY2VzcyBlcnJvcgoKIyMjIyBGaXhlZCBFZmZlY3RzCmJldGEgfiBkbW5vcm0obXVfYmV0YSwgdGF1X2JldGEpICMgUHJpb3Igb24gYmV0YSBjb2VmZmljaWVudHMKCmZvcihwIGluIDE6bnApewppbnRbcF0gfiBkbm9ybShtdV9pbnQsIHRhdV9pbnQpICMgUHJpb3Igb24gcG9uZC1zcGVjaWZpYyBpbnRlcmNlcHRzCn0KCiMjIyMgRGF0YSBNb2RlbApmb3IodCBpbiAxOm4peyAjIGxvb3Agb3ZlciBhbGwgdGltZSBzdGVwcwpmb3IocCBpbiAxOm5wKXsKT0JTW3QscF0gfiBkbm9ybSh4W3QscF0sIHRhdV9vYnMpICMgT2JzZXJ2ZWQgd2F0ZXIgdGVtcGVyYXR1cmUgaXMgZHJhd24gZnJvbSBsYXRlbnQgYWlyIHRlbXBlcmF0dXJlIHdpdGggb2JzZXJ2YXRpb24gdW5jZXJ0YWludHkKfQpYZlt0XSB+IGRub3JtKG11QWlyVGVtcFt0XSwgdGF1QWlyVGVtcFt0XSkgIyBMYXRlbnQgYWlyIHRlbXBlcmF0dXJlIGlzIGRyYXduIGZyb20gbWVhbiBhbmQgcHJlY2lzaW9uIG9mIGZvcmVjYXNhdGVkIGFpciB0ZW1wZXJhdHVyZQp9CgojIyMjIFByb2Nlc3MgTW9kZWwKZm9yKHQgaW4gMjpuKXsgIyBsb29wIG92ZXIgYWxsIHRpbWUgc3RlcHMgZXhjZXB0IHRlaCBmaXJzdCAod2UgZGVmaW5lZCBpYyBhYm92ZSkKZm9yKHAgaW4gMTpucCl7Cm11W3QscF0gPC0geFt0LTEscF0gKyBpbnRbcF0gKyBiZXRhWzFdICogeFt0LTEscF0gKyBiZXRhWzJdICogWGZbdF0gIyBNZWFuIHdhdGVyIHRlbXBlcmF0dXJlIGlzIGEgZnVuY3Rpb24gb2YgdGhlIHByZXZpb3VzIHRpbWUgc3RlcCBhbmQgY3VycmVudCBhaXIgdGVtcGVyYXR1cmUKeFt0LHBdIH4gZG5vcm0obXVbdCxwXSwgdGF1X2FkZCkgIyBMYXRlbnQgd2F0ZXIgdGVtcGVyYXR1cmUgaXMgZHJhd24gZnJvbSBtZWFuIHdhdGVyIHRlbXBlcmF0dXJlIHdpdGggcHJvY2VzcyB1bmNlcnRhaW50eQp9Cn0KfQoiCmBgYAoKRGVmaW5lIHRoZSBkYXRhIGFuZCBwcmlvcnMgZm9yIHRoZSBtb2RlbAoKYGBge3J9CiMgRW1wdHkgbGlzdApkYXRhIDwtIGxpc3QoKQojIFdhdGVyIHRlbXBlcmF0dXJlIG9ic2VydmF0aW9ucwpkYXRhJE9CUyA8LSBkcGx5cjo6c2VsZWN0KENSX1dhdGVyVGVtcDQ1LCAtZGF0ZSkKIyBOdW1iZXIgb2YgdGltZSBzdGVwcwpkYXRhJG4gPC0gbnJvdyhkYXRhJE9CUykKIyBOdW1iZXIgb2YgcG9uZHMKZGF0YSRucCA8LSBuY29sKGRhdGEkT0JTKQojIEluaXRpYWwgd2F0ZXIgdGVtcGVyYXR1cmUgbWVhbgpkYXRhJHhfaWMgPC0gMC4xCiMgSW5pdGlhbCB3YXRlciB0ZW1wZXJhdHVyZSBwcmVjaXNpb24KZGF0YSR0YXVfaWMgPSAwLjEKIyBQcmlvciBwYXJhbWV0ZXJzIGZvciBvYnNlcnZhdGlvbiBhbmQgcHJvY2VzcyB1bmNlcnRhaW50eQpkYXRhJGFfb2JzID0gMQpkYXRhJHJfb2JzID0gMQpkYXRhJGFfYWRkID0gMQpkYXRhJHJfYWRkID0gMQojIFByaW9yIHBhcmFtZXRlcnMgZm9yIGJldGEgY29lZmZpY2llbnRzCmRhdGEkbXVfYmV0YSA8LSBjKDAsIDApCmRhdGEkdGF1X2JldGEgPC0gZGlhZyh4ID0gYygwLjAwMSwgMC4wMDEpLCBucm93ID0gMiwgbmNvbCA9IDIpCiMgUHJpb3IgcGFyYW1ldGVycyBmb3IgaW50ZXJjZXB0CmRhdGEkbXVfaW50IDwtIDAKZGF0YSR0YXVfaW50IDwtIDAuMDAxCiMgTWVhbiBhaXIgdGVtcGVyYXR1cmUgZXN0aW1hdGUKZGF0YSRtdUFpclRlbXAgPC0gQ1JfQWlyVGVtcDQ1JEFpcl9Nb250aEF2ZwojIEFpciB0ZW1wZXJhdHVyZSBwcmVjaXNpb24KZGF0YSR0YXVBaXJUZW1wIDwtIENSX0FpclRlbXA0NSRwcmVjaXNpb24KCmBgYAoKQ3JlYXRlIEpBR1MgbW9kZWwgd2l0aCAzIGNoYWlucwoKYGBge3J9CmptIDwtIGphZ3MubW9kZWwoZmlsZSA9IHRleHRDb25uZWN0aW9uKGRsbV9wb29sZWQpLCBkYXRhID0gZGF0YSwgbi5jaGFpbnMgPSAzKQpgYGAKClBvc3RlcmlvciBzYW1wbGVzIG9mIHBhcmFtZXRlcnMKCmBgYHtyfQpDUkQ0NV9vdXRfcGFyYW1zIDwtIGNvZGEuc2FtcGxlcyhtb2RlbCA9IGptLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZXMgPSBjKCdiZXRhJywgJ2ludCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RhdV9hZGQnLCAndGF1X29icycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5pdGVyID0gNTAwMDAsIHRoaW4gPSAyNSkKYGBgCgpQb3N0ZXJpb3Igc2FtcGxlcyBvZiByZXNwb25zZSB2YXJpYWJsZXMKCmBgYHtyfQpDUkQ0NV9vdXRfcmVzcG9uc2UgPC0gY29kYS5zYW1wbGVzKG1vZGVsID0gam0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWVzID0gYygneCcsICdPQlMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5pdGVyID0gMTAwMDAwLCB0aGluID0gMjUpCmBgYAoKQSBjb3VwbGUgcXVpY2sgY2hlY2tzIGhlcmUKCmBgYHtyfQojIHBsb3QoQ1JENDVfb3V0X3BhcmFtcykKZ2VsbWFuLmRpYWcoQ1JENDVfb3V0X3BhcmFtcywgY29uZmlkZW5jZSA9IDAuOTkpCgpgYGAKClZpc3VhbGl6ZSB0aGUgb3V0cHV0IGJ5IGp1c3QgbG9va2luZyBhdCB0aGUgKio5NSUgY3JlZGlibGUgaW50ZXJ2YWwgb2YgdGhlIHRpbWUtc2VyaWVzIG9mIFgncyoqIGFuZCBjb21wYXJlIHRoYXQgdG8gdGhlIG9ic2VydmVkIFkncwoKVHJhbnNmb3JtIHRoZSBzYW1wbGVzIGJhY2sgZnJvbSB0aGUgbG9nIGRvbWFpbiB0byB0aGUgbGluZWFyIGRvbWFpbgoKYGBge3J9CnRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgYWRqdXN0IHRvIHpvb20gaW4gYW5kIG91dAp0aW1lIDwtYXMuRGF0ZSh0aW1lKQpvdXQgPC0gYXMubWF0cml4KENSRDQ1X291dF9yZXNwb25zZSkgICAgICAgICAjIyBjb252ZXJ0IGZyb20gY29kYSB0byBtYXRyaXgKYGBgCgpjb2RlIGZyb20gQU1XIGZvciBzcGxpdHRpbmcgdXAgdGhpcyBtYXRyaXgKYGBge3J9CnhfY29scyA8LSBncmVwKCdeeCcsIGNvbG5hbWVzKG91dCkpCm9ic19jb2xzIDwtIGdyZXAoJ15PQlMnLCBjb2xuYW1lcyhvdXQpKQoKb3V0X3ggPC0gb3V0Wyx4X2NvbHNdCm91dF9vYnMgPC0gb3V0WyxvYnNfY29sc10KCnJtKG91dCkKCm91dF94IDwtIHQob3V0X3gpCgpvdXRfeCA8LSBhcy5kYXRhLmZyYW1lKG91dF94KQpvdXRfeDIgPC0gb3V0X3ggfD4KICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAndGltZV9wb25kJykgfD4KICBkcGx5cjo6bXV0YXRlKHRpbWVzdGVwID0gc3ViKHggPSB0aW1lX3BvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJy4qeFxcWycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHRpbWVzdGVwID0gc3ViKHggPSB0aW1lc3RlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLC4qJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJy4qLCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICdcXF0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSkgfD4KICB0aWR5cjo6cGl2b3RfbG9uZ2VyKC1jKHRpbWVfcG9uZCwgdGltZXN0ZXAsIHBvbmQpLAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAnaXRlcicsIHZhbHVlc190byA9ICd2YWwnKSB8PgogIGRwbHlyOjpncm91cF9ieShwb25kLCB0aW1lc3RlcCkgfD4KICBkcGx5cjo6c3VtbWFyaXplKGxvdyA9IHF1YW50aWxlKHZhbCwgcHJvYnMgPSAwLjAyNSksCiAgICAgICAgICAgICAgICAgICBtZWQgPSBtZWRpYW4odmFsKSwKICAgICAgICAgICAgICAgICAgIGhpZ2ggPSBxdWFudGlsZSh2YWwsIHByb2JzID0gMC45NzUpKQoKdGltZXN0ZXBzIDwtIGFzLmRhdGEuZnJhbWUodGltZSkKdGltZXN0ZXBzJGluZCA8LSBhcy5jaGFyYWN0ZXIoc2VxKGZyb20gPSAxLCB0byA9IG5yb3codGltZXN0ZXBzKSwgYnkgPSAxKSkKY29sbmFtZXModGltZXN0ZXBzKSA8LSBjKCd0aW1lJywgJ3RpbWVzdGVwJykKCnBvbmRzIDwtIGFzLmRhdGEuZnJhbWUoY29sbmFtZXMoQ1JfV2F0ZXJUZW1wNDVbLTFdKSkKcG9uZHMkaW5kIDwtIGFzLmNoYXJhY3RlcihzZXEoZnJvbSA9IDEsIHRvID0gbnJvdyhwb25kcyksIGJ5ID0gMSkpCmNvbG5hbWVzKHBvbmRzKSA8LSBjKCdwb25kX25hbWUnLCAncG9uZCcpCgpvdXRfeF9tYXBwZWQgPC0gb3V0X3gyIHw+CiAgZHBseXI6OmxlZnRfam9pbih5ID0gdGltZXN0ZXBzLCBieSA9ICd0aW1lc3RlcCcpIHw+CiAgZHBseXI6OmxlZnRfam9pbih5ID0gcG9uZHMsIGJ5ID0gJ3BvbmQnKSB8PgogIGRwbHlyOjpzZWxlY3QobG93LCBtZWQsIGhpZ2gsIHRpbWUsIHBvbmRfbmFtZSkKCnBYIDwtIG91dF94X21hcHBlZCB8PgogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoZ2dwbG90Mjo6YWVzKHggPSB0aW1lLCB5ID0gbWVkKSkgKwogIGdncGxvdDI6Omdlb21fcmliYm9uKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeW1pbiA9IGxvdywgeW1heCA9IGhpZ2gpKSArCiAgZ2dwbG90Mjo6ZmFjZXRfd3JhcCh+cG9uZF9uYW1lKQoKb3V0X29icyA8LSB0KG91dF9vYnMpCgpvdXRfb2JzIDwtIGFzLmRhdGEuZnJhbWUob3V0X29icykKCm91dF9vYnMyIDwtIG91dF9vYnMgfD4KICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAndGltZV9wb25kJykgfD4KICBkcGx5cjo6bXV0YXRlKHRpbWVzdGVwID0gc3ViKHggPSB0aW1lX3BvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJy4qT0JTXFxbJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgdGltZXN0ZXAgPSBzdWIoeCA9IHRpbWVzdGVwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcsLionLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJyksCiAgICAgICAgICAgICAgICBwb25kID0gc3ViKHggPSB0aW1lX3BvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLiosJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJyksCiAgICAgICAgICAgICAgICBwb25kID0gc3ViKHggPSBwb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJ1xcXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpKSB8PgogIHRpZHlyOjpwaXZvdF9sb25nZXIoLWModGltZV9wb25kLCB0aW1lc3RlcCwgcG9uZCksCiAgICAgICAgICAgICAgICAgICAgICBuYW1lc190byA9ICdpdGVyJywgdmFsdWVzX3RvID0gJ3ZhbCcpIHw+CiAgZHBseXI6Omdyb3VwX2J5KHBvbmQsIHRpbWVzdGVwKSB8PgogIGRwbHlyOjpzdW1tYXJpemUobG93ID0gcXVhbnRpbGUodmFsLCBwcm9icyA9IDAuMDI1KSwKICAgICAgICAgICAgICAgICAgIG1lZCA9IG1lZGlhbih2YWwpLAogICAgICAgICAgICAgICAgICAgaGlnaCA9IHF1YW50aWxlKHZhbCwgcHJvYnMgPSAwLjk3NSkpCgpvdXRfb2JzX21hcHBlZCA8LSBvdXRfb2JzMiB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHRpbWVzdGVwcywgYnkgPSAndGltZXN0ZXAnKSB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHBvbmRzLCBieSA9ICdwb25kJykgfD4KICBkcGx5cjo6c2VsZWN0KGxvdywgbWVkLCBoaWdoLCB0aW1lLCBwb25kX25hbWUpCgpwT0JTIDwtIG91dF9vYnNfbWFwcGVkIHw+CiAgZ2dwbG90Mjo6Z2dwbG90KCkgKwogIGdncGxvdDI6Omdlb21fbGluZShnZ3Bsb3QyOjphZXMoeCA9IHRpbWUsIHkgPSBtZWQpKSArCiAgZ2dwbG90Mjo6Z2VvbV9yaWJib24oZ2dwbG90Mjo6YWVzKHggPSB0aW1lLCB5bWluID0gbG93LCB5bWF4ID0gaGlnaCkpICsKICBnZ3Bsb3QyOjpmYWNldF93cmFwKH5wb25kX25hbWUpCgpjb3dwbG90OjpwbG90X2dyaWQocFgsIHBPQlMpCmBgYAoKIyMjIFByb2JhYmlsaXR5IG9mIENyb3NzaW5nIFRocmVzaG9sZAoKYGBge3J9CnRocmVzaG9sZF9wcm9icyA8LSBvdXRfb2JzIHw+CiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gJ3RpbWVfcG9uZCcpIHw+CiAgZHBseXI6Om11dGF0ZSh0aW1lc3RlcCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKk9CU1xcWycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHRpbWVzdGVwID0gc3ViKHggPSB0aW1lc3RlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLC4qJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJy4qLCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICdcXF0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSkgfD4KICB0aWR5cjo6cGl2b3RfbG9uZ2VyKC1jKHRpbWVfcG9uZCwgdGltZXN0ZXAsIHBvbmQpLAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAnaXRlcicsIHZhbHVlc190byA9ICd2YWwnKSB8PgogIGRwbHlyOjpncm91cF9ieShwb25kLCB0aW1lc3RlcCkgfD4KICBkcGx5cjo6c3VtbWFyaXplKG5faXRlciA9IGRwbHlyOjpuKCksCiAgICAgICAgICAgICAgICAgICBuX3RocmVzaCA9IHN1bSh2YWwgPiAyMCksCiAgICAgICAgICAgICAgICAgICBwcm9iID0gKG5fdGhyZXNoIC8gbl9pdGVyKSAqIDEwMCkKCnRocmVzaG9sZF9wcm9ic19tYXBwZWQgPC0gdGhyZXNob2xkX3Byb2JzIHw+CiAgZHBseXI6OmxlZnRfam9pbih5ID0gdGltZXN0ZXBzLCBieSA9ICd0aW1lc3RlcCcpIHw+CiAgZHBseXI6OmxlZnRfam9pbih5ID0gcG9uZHMsIGJ5ID0gJ3BvbmQnKQoKdGhyZXNob2xkX3Byb2JzX21hcHBlZCB8PgogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoZ2dwbG90Mjo6YWVzKHggPSB0aW1lLCB5ID0gcHJvYikpICsKICBnZ3Bsb3QyOjpmYWNldF93cmFwKH5wb25kX25hbWUpCmBgYAoKU2F2ZSB0aGVzZSBvdXB1dHMgdXNpbmcgYSAuUkRhdGFGaWxlIHR5cGUKCmBgYHtyfQpzYXZlLmltYWdlKGZpbGUgPSAiQ29ycl9Qb29sZWRNb2RfQ1JENDUuUkRhdGEiKQoKI0N1cnJlbnRseSB0aGlzIGhhcyBhbGwgdGhlIGluZm9ybWF0aW9uIGluIGl0LiBFdmVudHVhbGx5IGNvdWxkIGxpbWl0IHRoaXMgdG8gYmUganVzdCB0aGUgcmVsYXZlbnQgaW5mb3JtYXRpb24gZm9yIHRoZSByZW1haW5pbmcgY29kZSBiZWxvdwpgYGAKCiMjIyBNYWtpbmcgR3JhcGhzCgpMb2FkIGluIHRoaXMgZmlsZSBoZXJlIGFzIGxvbmcgYXMgbm8gY29kZSBjaGFuZ2VzIGFyZSBuZWVkZWQgYWJvdmUKCmBgYHtyfQpsb2FkKGZpbGUgPSAiQ29ycl9Qb29sZWRNb2RfQ1JENDUuUkRhdGEiKQpgYGAKCkNyZWF0aW5nIHNvbWUgbmljZSBwbG90cyBvZiB0aGVzZQoKMS4gY29sb3JlZCBwYW5lbCBwbG90IChlYWNoIHBvbmRzIGZvcmVjYXN0IHdpdGggdGhlIG1lZGlhbiwgaGlnaCwgYW5kIGxvdyBwbHVzIGEgdHJlbmQgbGluZSkKYGBge3J9CiMgc2V0IHVwIHRoZSBjb2xvcnMgaGVyZSBmb3IgdGhlIHBsb3RzIGJlbG93IHNvIHRoYXQgZWFjaCBwb25kIGhhcyB0aGUgc2FtZSBjb2xvciBlYWNoIHRpbWUKTW9kX0NSRDQ1IDwtIG91dF9vYnNfbWFwcGVkCnN0cihNb2RfQ1JENDUpCndyaXRlLmNzdihNb2RfQ1JENDUsICJDb3JyX01vZF9DUkQ0NS5jc3YiKQoKIyBEZWZpbmUgdGhlIGN1c3RvbSBjb2xvciBwYWxldHRlCkNSX2NvbG9ycyA8LSBjKCIjRTQxQTFDIiwgIiMzNzdFQjgiLCAiIzREQUY0QSIsICIjOTg0RUEzIiwgIiNGRjdGMDAiLCAiI0ZGRkYzMyIsICIjQTY1NjI4IiwgIiNGNzgxQkYiLCAibGlnaHRibHVlIikKCiMgRW5zdXJlIHRoYXQgQ1JfY29sb3JzIGhhcyB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIG51bWJlciBvZiB1bmlxdWUgcG9uZHMKdW5pcXVlX3BvbmRzIDwtIHVuaXF1ZShNb2RfQ1JENDUkcG9uZF9uYW1lKQppZiAobGVuZ3RoKENSX2NvbG9ycykgIT0gbGVuZ3RoKHVuaXF1ZV9wb25kcykpIHsKICBzdG9wKCJUaGUgbnVtYmVyIG9mIGNvbG9ycyBpbiBDUl9jb2xvcnMgZG9lcyBub3QgbWF0Y2ggdGhlIG51bWJlciBvZiB1bmlxdWUgcG9uZHMuIikKfQoKIyBDcmVhdGUgYSBuYW1lZCB2ZWN0b3IgZm9yIENSX2NvbG9ycyB3aXRoIHBvbmQgbmFtZXMKY29sb3JfbWFwcGluZyA8LSBzZXROYW1lcyhDUl9jb2xvcnMsIHVuaXF1ZV9wb25kcykKCiMgUGxvdHRpbmcKUG9uZHNfQ1JENDUgPC0gZ2dwbG90KGRhdGEgPSBNb2RfQ1JENDUsIGFlcyh4ID0gdGltZSkpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGxvdywgeW1heCA9IGhpZ2gsIGZpbGwgPSBwb25kX25hbWUpKSArICAjIEFkZCB0aGUgcmliYm9uIHdpdGggY29sb3JzCiAgZ2VvbV9saW5lKGFlcyh5ID0gbWVkLCBjb2xvciA9IHBvbmRfbmFtZSkpICsgICMgRW5zdXJlIGxpbmVzIGFyZSB2aXNpYmxlIGFuZCBjb2xvcmVkIGJ5IHBvbmQKICBnZW9tX3Ntb290aChhZXMoeSA9IG1lZCwgY29sb3IgPSAiZ3JleSIpLCBzaXplID0gMSkgKyAgIyBFbnN1cmUgbGluZXMgYXJlIHZpc2libGUgYW5kIGNvbG9yZWQgYnkgcG9uZAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGFzLkRhdGUoIjIwMjAtMTItMDEiKSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAicmVkIikgKyAgIyBBZGQgdmVydGljYWwgZGFzaGVkIHJlZCBsaW5lCiAgZmFjZXRfd3JhcCh+IHBvbmRfbmFtZSkgKyAgIyBGYWNldCBieSBwb25kX25hbWUKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfbWFwcGluZykgKyAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgbGluZXMKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgcmliYm9ucwogIHhsYWIoIlllYXIiKSArCiAgeWxhYigiV2F0ZXIgVGVtcGVyYXR1cmUgKMKwQykiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjQpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpClBvbmRzX0NSRDQ1CgpnZ3NhdmUoIkNvcnJfSW5kUG9uZHNfQ1JENDUucG5nIiwgcGxvdCA9IFBvbmRzX0NSRDQ1LCB3aWR0aCA9IDgsIGhlaWdodCA9IDYpCgpgYGAKCjIuIFRyZW5kIGJ5IHBvbmQgKGdlb20gc21vb3RoIGZvciBlYWNoIHBvbmQgb24gdGhlIHNhbWUgcGxvdCBmb3IgY29tcGFyaXNvbikKCmBgYHtyfQojIHVzaW5nIHRoZSBzYW1lIGFlc3RldGljcyBhcyBhYm92ZQoKVHJlbmRzX0NSRDQ1IDwtIGdncGxvdChkYXRhID0gTW9kX0NSRDQ1LCBhZXMoeCA9IHRpbWUpKSArCiAgZ2VvbV9zbW9vdGgoYWVzKHkgPSBtZWQsIGNvbG9yID0gcG9uZF9uYW1lLCBmaWxsID0gcG9uZF9uYW1lKSwgYWxwaGEgPSAwLjE1LCBzaXplID0gMSkgKyAgIyBTbW9vdGggbGluZXMgd2l0aCBjb2xvcnMgYnkgcG9uZF9uYW1lCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX21hcHBpbmcpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgcmliYm9ucwogIGxhYnMoCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgeSA9ICJXYXRlciBUZW1wZXJhdHVyZSAowrBDKSIsCiAgICAgICBjb2xvciA9ICJQb25kIE5hbWUiLAogICAgICAgZmlsbCA9ICJQb25kIE5hbWUiKSArICAjIExhYmVscyBmb3IgbGVnZW5kCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTgpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksICMgQ2hhbmdlIHRoZSBsZWdlbmQgdGV4dCBzaXplIGhlcmUKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkgIyBQb3NpdGlvbiB0aGUgbGVnZW5kIG9uIHRoZSByaWdodApUcmVuZHNfQ1JENDUKCmdnc2F2ZSgiQ29ycl9JbmRUcmVuZHNfQ1JENDUucG5nIiwgcGxvdCA9IFRyZW5kc19DUkQ0NSwgd2lkdGggPSA5LCBoZWlnaHQgPSA2KQoKYGBgCgozLiBwcm9iYWJpbGl0eSBwbG90IChieSBwb25kKQoKYGBge3J9CnByb2JzX0NSRDQ1IDwtIHRocmVzaG9sZF9wcm9ic19tYXBwZWQKd3JpdGUuY3N2KHByb2JzX0NSRDQ1LCAiQ29ycl9wcm9ic19DUkQ0NS5jc3YiKQoKUHJvYnMyMF9DUkQ0NSA8LSBnZ3Bsb3QoZGF0YSA9IHByb2JzX0NSRDQ1LCBhZXMoeCA9IHRpbWUpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gcHJvYiwgY29sb3IgPSBwb25kX25hbWUpKSArICAjIEVuc3VyZSBsaW5lcyBhcmUgdmlzaWJsZSBhbmQgY29sb3JlZCBieSBwb25kCiAgZmFjZXRfd3JhcCh+IHBvbmRfbmFtZSkgKyAgIyBGYWNldCBieSBwb25kX25hbWUKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfbWFwcGluZykgKyAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgbGluZXMKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoIlByb2JhYmlsaXR5IikgKwogIHhsaW0oYXMuRGF0ZShjKCIyMDIwLTEyLTAxIiwgIjIwOTktMTItMDEiKSkpICsKICB5bGltKDAsMTAwKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTgpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDU1LCBoanVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpClByb2JzMjBfQ1JENDUKCmdnc2F2ZSgiQ29ycl9Qcm9iczIwX0NSRDQ1LnBuZyIsIHBsb3QgPSBQcm9iczIwX0NSRDQ1LCB3aWR0aCA9IDksIGhlaWdodCA9IDYpCmBgYAoKNC4gTW9kZWwgZml0cyBieSBwb25kCgpgYGB7cn0KTW9kX0NSRDQ1CgpNb2RPYnMgPC0gTW9kX0NSRDQ1ICU+JQogIGZpbHRlcih0aW1lIDwgIjIwMjEtMDEtMDEiKQpyYW5nZShNb2RPYnMkdGltZSkKCk1vZGVsRXJyb3JQbG90X0NSRDQ1IDwtIGdncGxvdChkYXRhID0gTW9kT2JzLCBhZXMoeCA9IHRpbWUpKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBsb3csIHltYXggPSBoaWdoLCBmaWxsID0gcG9uZF9uYW1lKSkgKyAgIyBBZGp1c3QgZmlsbCBjb2xvcnMKICBnZW9tX2xpbmUoYWVzKHkgPSBtZWQpLCBjb2xvciA9ICJibGFjayIpICsgICMgQmxhY2sgbGluZXMgZm9yIHRoZSBtZWRpYW4gdmFsdWVzCiAgZmFjZXRfd3JhcCh+IHBvbmRfbmFtZSkgKyAgIyBGYWNldCBieSBwb25kX25hbWUKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAjIEFwcGx5IGN1c3RvbSBjb2xvciBwYWxldHRlIGZvciByaWJib25zCiAgbGFicygKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gIldhdGVyIFRlbXBlcmF0dXJlICjCsEMpIiwKICAgICAgIGNvbG9yID0gIlBvbmQgTmFtZSIsCiAgICAgICBmaWxsID0gIlBvbmQgTmFtZSIpICsgICMgTGFiZWxzIGZvciBsZWdlbmQKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIgIyBBbmdsZSB4LWF4aXMgbGFiZWxzIGlmIG5lZWRlZAogICkKTW9kZWxFcnJvclBsb3RfQ1JENDUKCmdnc2F2ZSgiQ29ycl9FcnJvcl9DUkQ0NS5wbmciLCBwbG90ID0gTW9kZWxFcnJvclBsb3RfQ1JENDUsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNikKYGBgCgpDbGVhciBvdXQgdGhlIGVudmlyb25tZW50IGFuZCByZWxvYWQgdGhlIGJhc2ljcyBiZWZvcmUgc3RhcnRpbmcgdGhlIG5leHQgc2VjdGlvbgoKYGBge3J9CnJtKGxpc3QgPSBscygpKQoKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmphZ3MpCmxpYnJhcnkoZ2dwbG90MikKCnNldC5zZWVkKDEpCmBgYAoKCiMjIFJDUCA4LjUKCiMjIyBEZXNpZ24gdGhlIE1vZGVsCgpSZWFkIGluIHRoZSBkYXRhIGhlcmUsIHdoaWNoIGlzIGFuIG91dHB1dCBvZiBYWCBjb2RlIGZpbGUKClRoZW4gc2VwYXJhdGUgdGhlIGRhdGEgaW50byBhaXIgYW5kIHdhdGVyIHRlbXBlcmF0dXJlIGZpbGVzCgpgYGB7cn0KIyBBaXIgYW5kIHdhdGVyIHRlbXBlcmF0dXJlIGRhdGE6IENSIGxvY2F0aW9uLCA0LjUgc2NlbmFyaW8KQ1JfVGVtcHMgPC0gcmVhZC5jc3YoIkNSXzg1U05BUEZvcmVjYXN0X01vbkNvcnIuY3N2IiwgaGVhZGVyPVRSVUUpCgojIEFpciB0ZW1wZXJhdHVyZSB2YXJpYWJsZXMKQ1JfQWlyVGVtcDg1IDwtIENSX1RlbXBzICU+JQogIHNlbGVjdChkYXRlLCBBaXJwb3J0LCBBaXJfTW9udGhBdmcsIHN0ZCwgcHJlY2lzaW9uLCBSZWdpb24pCgojIFdhdGVyIHRlbXBlcmF0dXJlIHZhcmlhYmxlcwpDUl9XYXRlclRlbXA4NSA8LSBDUl9UZW1wcyAlPiUKICBzZWxlY3QoZGF0ZSwgQlZTLCBDQUIsIFRJTiwgU1FSLCBDQU4sIEVZUywgVElTLCBXREQsIFJITSkKCgojIFNldCB1cCBhIHN0cmluZyBvZiBhbGwgdGhlIGRhdGVzCnRpbWUgPC0gQ1JfV2F0ZXJUZW1wODUkZGF0ZQpsZW5ndGgodGltZSkKYGBgCgpTZXR0aW5nIHVwIHRoZSByYW5kb20gd2FsayBtb2RlbAoKYGBge3J9CmRsbV9wb29sZWQgPC0gIgptb2RlbHsKIyMjIyBQcmlvcnMKZm9yKHAgaW4gMTpucCl7CnhbMSxwXSB+IGRub3JtKHhfaWMsIHRhdV9pYykgIyBJbml0aWFsIGNvbmRpdGlvbiBvZiB3YXRlciB0ZW1wZXJhdHVyZQp9CnRhdV9vYnMgfiBkZ2FtbWEoYV9vYnMsIHJfb2JzKSAjIFByaW9yIG9uIG9ic2VydmF0aW9uIGVycm9yCnRhdV9hZGQgfiBkZ2FtbWEoYV9hZGQsIHJfYWRkKSAjIFByaW9yIG9uIHByb2Nlc3MgZXJyb3IKCiMjIyMgRml4ZWQgRWZmZWN0cwpiZXRhIH4gZG1ub3JtKG11X2JldGEsIHRhdV9iZXRhKSAjIFByaW9yIG9uIGJldGEgY29lZmZpY2llbnRzCgpmb3IocCBpbiAxOm5wKXsKaW50W3BdIH4gZG5vcm0obXVfaW50LCB0YXVfaW50KSAjIFByaW9yIG9uIHBvbmQtc3BlY2lmaWMgaW50ZXJjZXB0cwp9CgojIyMjIERhdGEgTW9kZWwKZm9yKHQgaW4gMTpuKXsgIyBsb29wIG92ZXIgYWxsIHRpbWUgc3RlcHMKZm9yKHAgaW4gMTpucCl7Ck9CU1t0LHBdIH4gZG5vcm0oeFt0LHBdLCB0YXVfb2JzKSAjIE9ic2VydmVkIHdhdGVyIHRlbXBlcmF0dXJlIGlzIGRyYXduIGZyb20gbGF0ZW50IGFpciB0ZW1wZXJhdHVyZSB3aXRoIG9ic2VydmF0aW9uIHVuY2VydGFpbnR5Cn0KWGZbdF0gfiBkbm9ybShtdUFpclRlbXBbdF0sIHRhdUFpclRlbXBbdF0pICMgTGF0ZW50IGFpciB0ZW1wZXJhdHVyZSBpcyBkcmF3biBmcm9tIG1lYW4gYW5kIHByZWNpc2lvbiBvZiBmb3JlY2FzYXRlZCBhaXIgdGVtcGVyYXR1cmUKfQoKIyMjIyBQcm9jZXNzIE1vZGVsCmZvcih0IGluIDI6bil7ICMgbG9vcCBvdmVyIGFsbCB0aW1lIHN0ZXBzIGV4Y2VwdCB0ZWggZmlyc3QgKHdlIGRlZmluZWQgaWMgYWJvdmUpCmZvcihwIGluIDE6bnApewptdVt0LHBdIDwtIHhbdC0xLHBdICsgaW50W3BdICsgYmV0YVsxXSAqIHhbdC0xLHBdICsgYmV0YVsyXSAqIFhmW3RdICMgTWVhbiB3YXRlciB0ZW1wZXJhdHVyZSBpcyBhIGZ1bmN0aW9uIG9mIHRoZSBwcmV2aW91cyB0aW1lIHN0ZXAgYW5kIGN1cnJlbnQgYWlyIHRlbXBlcmF0dXJlCnhbdCxwXSB+IGRub3JtKG11W3QscF0sIHRhdV9hZGQpICMgTGF0ZW50IHdhdGVyIHRlbXBlcmF0dXJlIGlzIGRyYXduIGZyb20gbWVhbiB3YXRlciB0ZW1wZXJhdHVyZSB3aXRoIHByb2Nlc3MgdW5jZXJ0YWludHkKfQp9Cn0KIgpgYGAKCkRlZmluZSB0aGUgZGF0YSBhbmQgcHJpb3JzIGZvciB0aGUgbW9kZWwKCmBgYHtyfQojIEVtcHR5IGxpc3QKZGF0YSA8LSBsaXN0KCkKIyBXYXRlciB0ZW1wZXJhdHVyZSBvYnNlcnZhdGlvbnMKZGF0YSRPQlMgPC0gZHBseXI6OnNlbGVjdChDUl9XYXRlclRlbXA4NSwgLWRhdGUpCiMgTnVtYmVyIG9mIHRpbWUgc3RlcHMKZGF0YSRuIDwtIG5yb3coZGF0YSRPQlMpCiMgTnVtYmVyIG9mIHBvbmRzCmRhdGEkbnAgPC0gbmNvbChkYXRhJE9CUykKIyBJbml0aWFsIHdhdGVyIHRlbXBlcmF0dXJlIG1lYW4KZGF0YSR4X2ljIDwtIDAuMQojIEluaXRpYWwgd2F0ZXIgdGVtcGVyYXR1cmUgcHJlY2lzaW9uCmRhdGEkdGF1X2ljID0gMC4xCiMgUHJpb3IgcGFyYW1ldGVycyBmb3Igb2JzZXJ2YXRpb24gYW5kIHByb2Nlc3MgdW5jZXJ0YWludHkKZGF0YSRhX29icyA9IDEKZGF0YSRyX29icyA9IDEKZGF0YSRhX2FkZCA9IDEKZGF0YSRyX2FkZCA9IDEKIyBQcmlvciBwYXJhbWV0ZXJzIGZvciBiZXRhIGNvZWZmaWNpZW50cwpkYXRhJG11X2JldGEgPC0gYygwLCAwKQpkYXRhJHRhdV9iZXRhIDwtIGRpYWcoeCA9IGMoMC4wMDEsIDAuMDAxKSwgbnJvdyA9IDIsIG5jb2wgPSAyKQojIFByaW9yIHBhcmFtZXRlcnMgZm9yIGludGVyY2VwdApkYXRhJG11X2ludCA8LSAwCmRhdGEkdGF1X2ludCA8LSAwLjAwMQojIE1lYW4gYWlyIHRlbXBlcmF0dXJlIGVzdGltYXRlCmRhdGEkbXVBaXJUZW1wIDwtIENSX0FpclRlbXA4NSRBaXJfTW9udGhBdmcKIyBBaXIgdGVtcGVyYXR1cmUgcHJlY2lzaW9uCmRhdGEkdGF1QWlyVGVtcCA8LSBDUl9BaXJUZW1wODUkcHJlY2lzaW9uCgpgYGAKCkNyZWF0ZSBKQUdTIG1vZGVsIHdpdGggMyBjaGFpbnMKCmBgYHtyfQpqbSA8LSBqYWdzLm1vZGVsKGZpbGUgPSB0ZXh0Q29ubmVjdGlvbihkbG1fcG9vbGVkKSwgZGF0YSA9IGRhdGEsIG4uY2hhaW5zID0gMykKYGBgCgpQb3N0ZXJpb3Igc2FtcGxlcyBvZiBwYXJhbWV0ZXJzCgpgYGB7cn0KQ1JEODVfb3V0X3BhcmFtcyA8LSBjb2RhLnNhbXBsZXMobW9kZWwgPSBqbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWVzID0gYygnYmV0YScsICdpbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0YXVfYWRkJywgJ3RhdV9vYnMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uaXRlciA9IDUwMDAwLCB0aGluID0gMjUpCmBgYAoKUG9zdGVyaW9yIHNhbXBsZXMgb2YgcmVzcG9uc2UgdmFyaWFibGVzCgpgYGB7cn0KQ1JEODVfb3V0X3Jlc3BvbnNlIDwtIGNvZGEuc2FtcGxlcyhtb2RlbCA9IGptLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lcyA9IGMoJ3gnLCAnT0JTJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uaXRlciA9IDEwMDAwMCwgdGhpbiA9IDI1KQpgYGAKCkEgY291cGxlIHF1aWNrIGNoZWNrcyBoZXJlCgpgYGB7cn0KIyBwbG90KENSRDg1X291dF9wYXJhbXMpCmdlbG1hbi5kaWFnKENSRDg1X291dF9wYXJhbXMsIGNvbmZpZGVuY2UgPSAwLjk5KQoKYGBgCgpWaXN1YWxpemUgdGhlIG91dHB1dCBieSBqdXN0IGxvb2tpbmcgYXQgdGhlICoqOTUlIGNyZWRpYmxlIGludGVydmFsIG9mIHRoZSB0aW1lLXNlcmllcyBvZiBYJ3MqKiBhbmQgY29tcGFyZSB0aGF0IHRvIHRoZSBvYnNlcnZlZCBZJ3MKClRyYW5zZm9ybSB0aGUgc2FtcGxlcyBiYWNrIGZyb20gdGhlIGxvZyBkb21haW4gdG8gdGhlIGxpbmVhciBkb21haW4KCmBgYHtyfQp0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIGFkanVzdCB0byB6b29tIGluIGFuZCBvdXQKdGltZSA8LWFzLkRhdGUodGltZSkKb3V0IDwtIGFzLm1hdHJpeChDUkQ4NV9vdXRfcmVzcG9uc2UpICAgICAgICAgIyMgY29udmVydCBmcm9tIGNvZGEgdG8gbWF0cml4CmBgYAoKY29kZSBmcm9tIEFNVyBmb3Igc3BsaXR0aW5nIHVwIHRoaXMgbWF0cml4CmBgYHtyfQp4X2NvbHMgPC0gZ3JlcCgnXngnLCBjb2xuYW1lcyhvdXQpKQpvYnNfY29scyA8LSBncmVwKCdeT0JTJywgY29sbmFtZXMob3V0KSkKCm91dF94IDwtIG91dFsseF9jb2xzXQpvdXRfb2JzIDwtIG91dFssb2JzX2NvbHNdCgpybShvdXQpCgpvdXRfeCA8LSB0KG91dF94KQoKb3V0X3ggPC0gYXMuZGF0YS5mcmFtZShvdXRfeCkKb3V0X3gyIDwtIG91dF94IHw+CiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gJ3RpbWVfcG9uZCcpIHw+CiAgZHBseXI6Om11dGF0ZSh0aW1lc3RlcCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKnhcXFsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJyksCiAgICAgICAgICAgICAgICB0aW1lc3RlcCA9IHN1Yih4ID0gdGltZXN0ZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJywuKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHRpbWVfcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKiwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHBvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnXFxdJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJykpIHw+CiAgdGlkeXI6OnBpdm90X2xvbmdlcigtYyh0aW1lX3BvbmQsIHRpbWVzdGVwLCBwb25kKSwKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gJ2l0ZXInLCB2YWx1ZXNfdG8gPSAndmFsJykgfD4KICBkcGx5cjo6Z3JvdXBfYnkocG9uZCwgdGltZXN0ZXApIHw+CiAgZHBseXI6OnN1bW1hcml6ZShsb3cgPSBxdWFudGlsZSh2YWwsIHByb2JzID0gMC4wMjUpLAogICAgICAgICAgICAgICAgICAgbWVkID0gbWVkaWFuKHZhbCksCiAgICAgICAgICAgICAgICAgICBoaWdoID0gcXVhbnRpbGUodmFsLCBwcm9icyA9IDAuOTc1KSkKCnRpbWVzdGVwcyA8LSBhcy5kYXRhLmZyYW1lKHRpbWUpCnRpbWVzdGVwcyRpbmQgPC0gYXMuY2hhcmFjdGVyKHNlcShmcm9tID0gMSwgdG8gPSBucm93KHRpbWVzdGVwcyksIGJ5ID0gMSkpCmNvbG5hbWVzKHRpbWVzdGVwcykgPC0gYygndGltZScsICd0aW1lc3RlcCcpCgpwb25kcyA8LSBhcy5kYXRhLmZyYW1lKGNvbG5hbWVzKENSX1dhdGVyVGVtcDg1Wy0xXSkpCnBvbmRzJGluZCA8LSBhcy5jaGFyYWN0ZXIoc2VxKGZyb20gPSAxLCB0byA9IG5yb3cocG9uZHMpLCBieSA9IDEpKQpjb2xuYW1lcyhwb25kcykgPC0gYygncG9uZF9uYW1lJywgJ3BvbmQnKQoKb3V0X3hfbWFwcGVkIDwtIG91dF94MiB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHRpbWVzdGVwcywgYnkgPSAndGltZXN0ZXAnKSB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHBvbmRzLCBieSA9ICdwb25kJykgfD4KICBkcGx5cjo6c2VsZWN0KGxvdywgbWVkLCBoaWdoLCB0aW1lLCBwb25kX25hbWUpCgpwWCA8LSBvdXRfeF9tYXBwZWQgfD4KICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeSA9IG1lZCkpICsKICBnZ3Bsb3QyOjpnZW9tX3JpYmJvbihnZ3Bsb3QyOjphZXMoeCA9IHRpbWUsIHltaW4gPSBsb3csIHltYXggPSBoaWdoKSkgKwogIGdncGxvdDI6OmZhY2V0X3dyYXAofnBvbmRfbmFtZSkKCm91dF9vYnMgPC0gdChvdXRfb2JzKQoKb3V0X29icyA8LSBhcy5kYXRhLmZyYW1lKG91dF9vYnMpCgpvdXRfb2JzMiA8LSBvdXRfb2JzIHw+CiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gJ3RpbWVfcG9uZCcpIHw+CiAgZHBseXI6Om11dGF0ZSh0aW1lc3RlcCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKk9CU1xcWycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHRpbWVzdGVwID0gc3ViKHggPSB0aW1lc3RlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLC4qJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJy4qLCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICdcXF0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSkgfD4KICB0aWR5cjo6cGl2b3RfbG9uZ2VyKC1jKHRpbWVfcG9uZCwgdGltZXN0ZXAsIHBvbmQpLAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAnaXRlcicsIHZhbHVlc190byA9ICd2YWwnKSB8PgogIGRwbHlyOjpncm91cF9ieShwb25kLCB0aW1lc3RlcCkgfD4KICBkcGx5cjo6c3VtbWFyaXplKGxvdyA9IHF1YW50aWxlKHZhbCwgcHJvYnMgPSAwLjAyNSksCiAgICAgICAgICAgICAgICAgICBtZWQgPSBtZWRpYW4odmFsKSwKICAgICAgICAgICAgICAgICAgIGhpZ2ggPSBxdWFudGlsZSh2YWwsIHByb2JzID0gMC45NzUpKQoKb3V0X29ic19tYXBwZWQgPC0gb3V0X29iczIgfD4KICBkcGx5cjo6bGVmdF9qb2luKHkgPSB0aW1lc3RlcHMsIGJ5ID0gJ3RpbWVzdGVwJykgfD4KICBkcGx5cjo6bGVmdF9qb2luKHkgPSBwb25kcywgYnkgPSAncG9uZCcpIHw+CiAgZHBseXI6OnNlbGVjdChsb3csIG1lZCwgaGlnaCwgdGltZSwgcG9uZF9uYW1lKQoKcE9CUyA8LSBvdXRfb2JzX21hcHBlZCB8PgogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoZ2dwbG90Mjo6YWVzKHggPSB0aW1lLCB5ID0gbWVkKSkgKwogIGdncGxvdDI6Omdlb21fcmliYm9uKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeW1pbiA9IGxvdywgeW1heCA9IGhpZ2gpKSArCiAgZ2dwbG90Mjo6ZmFjZXRfd3JhcCh+cG9uZF9uYW1lKQoKY293cGxvdDo6cGxvdF9ncmlkKHBYLCBwT0JTKQpgYGAKCiMjIyBQcm9iYWJpbGl0eSBvZiBDcm9zc2luZyBUaHJlc2hvbGQKCmBgYHtyfQp0aHJlc2hvbGRfcHJvYnMgPC0gb3V0X29icyB8PgogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICd0aW1lX3BvbmQnKSB8PgogIGRwbHlyOjptdXRhdGUodGltZXN0ZXAgPSBzdWIoeCA9IHRpbWVfcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLipPQlNcXFsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJyksCiAgICAgICAgICAgICAgICB0aW1lc3RlcCA9IHN1Yih4ID0gdGltZXN0ZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJywuKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHRpbWVfcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKiwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHBvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnXFxdJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJykpIHw+CiAgdGlkeXI6OnBpdm90X2xvbmdlcigtYyh0aW1lX3BvbmQsIHRpbWVzdGVwLCBwb25kKSwKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gJ2l0ZXInLCB2YWx1ZXNfdG8gPSAndmFsJykgfD4KICBkcGx5cjo6Z3JvdXBfYnkocG9uZCwgdGltZXN0ZXApIHw+CiAgZHBseXI6OnN1bW1hcml6ZShuX2l0ZXIgPSBkcGx5cjo6bigpLAogICAgICAgICAgICAgICAgICAgbl90aHJlc2ggPSBzdW0odmFsID4gMjApLAogICAgICAgICAgICAgICAgICAgcHJvYiA9IChuX3RocmVzaCAvIG5faXRlcikgKiAxMDApCgp0aHJlc2hvbGRfcHJvYnNfbWFwcGVkIDwtIHRocmVzaG9sZF9wcm9icyB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHRpbWVzdGVwcywgYnkgPSAndGltZXN0ZXAnKSB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHBvbmRzLCBieSA9ICdwb25kJykKCnRocmVzaG9sZF9wcm9ic19tYXBwZWQgfD4KICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeSA9IHByb2IpKSArCiAgZ2dwbG90Mjo6ZmFjZXRfd3JhcCh+cG9uZF9uYW1lKQpgYGAKClNhdmUgdGhlc2Ugb3VwdXRzIHVzaW5nIGEgLlJEYXRhRmlsZSB0eXBlCgpgYGB7cn0Kc2F2ZS5pbWFnZShmaWxlID0gIkNvcnJfUG9vbGVkTW9kX0NSRDg1LlJEYXRhIikKCiNDdXJyZW50bHkgdGhpcyBoYXMgYWxsIHRoZSBpbmZvcm1hdGlvbiBpbiBpdC4gRXZlbnR1YWxseSBjb3VsZCBsaW1pdCB0aGlzIHRvIGJlIGp1c3QgdGhlIHJlbGF2ZW50IGluZm9ybWF0aW9uIGZvciB0aGUgcmVtYWluaW5nIGNvZGUgYmVsb3cKYGBgCgojIyMgTWFrZWluZyBHcmFwaHMKCkxvYWQgaW4gdGhpcyBmaWxlIGhlcmUgYXMgbG9uZyBhcyBubyBjb2RlIGNoYW5nZXMgYXJlIG5lZWRlZCBhYm92ZQoKYGBge3J9CmxvYWQoZmlsZSA9ICJDb3JyX1Bvb2xlZE1vZF9DUkQ4NS5SRGF0YSIpCmBgYAoKQ3JlYXRpbmcgc29tZSBuaWNlIHBsb3RzIG9mIHRoZXNlCgoxLiBjb2xvcmVkIHBhbmVsIHBsb3QgKGVhY2ggcG9uZHMgZm9yZWNhc3Qgd2l0aCB0aGUgbWVkaWFuLCBoaWdoLCBhbmQgbG93IHBsdXMgYSB0cmVuZCBsaW5lKQoKYGBge3J9CiMgc2V0IHVwIHRoZSBjb2xvcnMgaGVyZSBmb3IgdGhlIHBsb3RzIGJlbG93IHNvIHRoYXQgZWFjaCBwb25kIGhhcyB0aGUgc2FtZSBjb2xvciBlYWNoIHRpbWUKTW9kX0NSRDg1IDwtIG91dF9vYnNfbWFwcGVkCnN0cihNb2RfQ1JEODUpCndyaXRlLmNzdihNb2RfQ1JEODUsICJDb3JyX01vZF9DUkQ4NS5jc3YiKQoKIyBEZWZpbmUgdGhlIGN1c3RvbSBjb2xvciBwYWxldHRlCkNSX2NvbG9ycyA8LSBjKCIjRTQxQTFDIiwgIiMzNzdFQjgiLCAiIzREQUY0QSIsICIjOTg0RUEzIiwgIiNGRjdGMDAiLCAiI0ZGRkYzMyIsICIjQTY1NjI4IiwgIiNGNzgxQkYiLCAibGlnaHRibHVlIikKCiMgRW5zdXJlIHRoYXQgQ1JfY29sb3JzIGhhcyB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIG51bWJlciBvZiB1bmlxdWUgcG9uZHMKdW5pcXVlX3BvbmRzIDwtIHVuaXF1ZShNb2RfQ1JEODUkcG9uZF9uYW1lKQppZiAobGVuZ3RoKENSX2NvbG9ycykgIT0gbGVuZ3RoKHVuaXF1ZV9wb25kcykpIHsKICBzdG9wKCJUaGUgbnVtYmVyIG9mIGNvbG9ycyBpbiBDUl9jb2xvcnMgZG9lcyBub3QgbWF0Y2ggdGhlIG51bWJlciBvZiB1bmlxdWUgcG9uZHMuIikKfQoKIyBDcmVhdGUgYSBuYW1lZCB2ZWN0b3IgZm9yIENSX2NvbG9ycyB3aXRoIHBvbmQgbmFtZXMKY29sb3JfbWFwcGluZyA8LSBzZXROYW1lcyhDUl9jb2xvcnMsIHVuaXF1ZV9wb25kcykKCiMgUGxvdHRpbmcKUG9uZHNfQ1JEODUgPC0gZ2dwbG90KGRhdGEgPSBNb2RfQ1JEODUsIGFlcyh4ID0gdGltZSkpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGxvdywgeW1heCA9IGhpZ2gsIGZpbGwgPSBwb25kX25hbWUpKSArICAjIEFkZCB0aGUgcmliYm9uIHdpdGggY29sb3JzCiAgZ2VvbV9saW5lKGFlcyh5ID0gbWVkLCBjb2xvciA9IHBvbmRfbmFtZSkpICsgICMgRW5zdXJlIGxpbmVzIGFyZSB2aXNpYmxlIGFuZCBjb2xvcmVkIGJ5IHBvbmQKICBnZW9tX3Ntb290aChhZXMoeSA9IG1lZCwgY29sb3IgPSAiZ3JleSIpLCBzaXplID0gMSkgKyAgIyBFbnN1cmUgbGluZXMgYXJlIHZpc2libGUgYW5kIGNvbG9yZWQgYnkgcG9uZAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGFzLkRhdGUoIjIwMjAtMTItMDEiKSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAicmVkIikgKyAgIyBBZGQgdmVydGljYWwgZGFzaGVkIHJlZCBsaW5lCiAgZmFjZXRfd3JhcCh+IHBvbmRfbmFtZSkgKyAgIyBGYWNldCBieSBwb25kX25hbWUKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfbWFwcGluZykgKyAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgbGluZXMKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgcmliYm9ucwogIHhsYWIoIlllYXIiKSArCiAgeWxhYigiV2F0ZXIgVGVtcGVyYXR1cmUgKMKwQykiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjQpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpClBvbmRzX0NSRDg1CgpnZ3NhdmUoIkNvcnJfSW5kUG9uZHNfQ1JEODUucG5nIiwgcGxvdCA9IFBvbmRzX0NSRDg1LCB3aWR0aCA9IDgsIGhlaWdodCA9IDYpCgpgYGAKCjIuIHRyZW5kIGJ5IHBvbmQgKGdlb20gc21vb3RoIGZvciBlYWNoIHBvbmQgb24gdGhlIHNhbWUgcGxvdCBmb3IgY29tcGFyaXNvbikKCmBgYHtyfQojIHVzaW5nIHRoZSBzYW1lIGFlc3RldGljcyBhcyBhYm92ZQoKVHJlbmRzX0NSRDg1IDwtIGdncGxvdChkYXRhID0gTW9kX0NSRDg1LCBhZXMoeCA9IHRpbWUpKSArCiAgZ2VvbV9zbW9vdGgoYWVzKHkgPSBtZWQsIGNvbG9yID0gcG9uZF9uYW1lLCBmaWxsID0gcG9uZF9uYW1lKSwgYWxwaGEgPSAwLjE1LCBzaXplID0gMSkgKyAgIyBTbW9vdGggbGluZXMgd2l0aCBjb2xvcnMgYnkgcG9uZF9uYW1lCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX21hcHBpbmcpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgcmliYm9ucwogIGxhYnMoCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgeSA9ICJXYXRlciBUZW1wZXJhdHVyZSAowrBDKSIsCiAgICAgICBjb2xvciA9ICJQb25kIE5hbWUiLAogICAgICAgZmlsbCA9ICJQb25kIE5hbWUiKSArICAjIExhYmVscyBmb3IgbGVnZW5kCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTgpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksICMgQ2hhbmdlIHRoZSBsZWdlbmQgdGV4dCBzaXplIGhlcmUKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkKVHJlbmRzX0NSRDg1CgpnZ3NhdmUoIkNvcnJfSW5kVHJlbmRzX0NSRDg1LnBuZyIsIHBsb3QgPSBUcmVuZHNfQ1JEODUsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNikKCmBgYAoKMy4gcHJvYmFiaWxpdHkgcGxvdCAoYnkgcG9uZCkKCmBgYHtyfQpwcm9ic19DUkQ4NSA8LSB0aHJlc2hvbGRfcHJvYnNfbWFwcGVkCndyaXRlLmNzdihwcm9ic19DUkQ4NSwgInByb2JzX0NSRDg1LmNzdiIpCgpQcm9iczIwX0NSRDg1IDwtIGdncGxvdChkYXRhID0gcHJvYnNfQ1JEODUsIGFlcyh4ID0gdGltZSkpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBwcm9iLCBjb2xvciA9IHBvbmRfbmFtZSkpICsgICMgRW5zdXJlIGxpbmVzIGFyZSB2aXNpYmxlIGFuZCBjb2xvcmVkIGJ5IHBvbmQKICBmYWNldF93cmFwKH4gcG9uZF9uYW1lKSArICAjIEZhY2V0IGJ5IHBvbmRfbmFtZQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAjIFVzZSBjdXN0b20gY29sb3JzIGZvciBsaW5lcwogIHhsYWIoIlllYXIiKSArCiAgeWxhYigiUHJvYmFiaWxpdHkiKSArCiAgeGxpbShhcy5EYXRlKGMoIjIwMjAtMTItMDEiLCAiMjA5OS0xMi0wMSIpKSkgKwogIHlsaW0oMCwxMDApICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAxOCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjIpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNTUsIGhqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKUHJvYnMyMF9DUkQ4NQoKZ2dzYXZlKCJDb3JyX1Byb2JzMjBfQ1JEODUucG5nIiwgcGxvdCA9IFByb2JzMjBfQ1JEODUsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNikKYGBgCgo0LiBNb2RlbCBmaXRzIGJ5IHBvbmQKCmBgYHtyfQpNb2RfQ1JEODUKCk1vZE9icyA8LSBNb2RfQ1JEODUgJT4lCiAgZmlsdGVyKHRpbWUgPCAiMjAyMS0wMS0wMSIpCnJhbmdlKE1vZE9icyR0aW1lKQoKTW9kZWxFcnJvclBsb3RfQ1JEODUgPC0gZ2dwbG90KGRhdGEgPSBNb2RPYnMsIGFlcyh4ID0gdGltZSkpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGxvdywgeW1heCA9IGhpZ2gsIGZpbGwgPSBwb25kX25hbWUpKSArICAjIEFkanVzdCBmaWxsIGNvbG9ycwogIGdlb21fbGluZShhZXMoeSA9IG1lZCksIGNvbG9yID0gImJsYWNrIikgKyAgIyBCbGFjayBsaW5lcyBmb3IgdGhlIG1lZGlhbiB2YWx1ZXMKICBmYWNldF93cmFwKH4gcG9uZF9uYW1lKSArICAjIEZhY2V0IGJ5IHBvbmRfbmFtZQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX21hcHBpbmcpICsgICMgQXBwbHkgY3VzdG9tIGNvbG9yIHBhbGV0dGUgZm9yIHJpYmJvbnMKICBsYWJzKAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiV2F0ZXIgVGVtcGVyYXR1cmUgKMKwQykiLAogICAgICAgY29sb3IgPSAiUG9uZCBOYW1lIiwKICAgICAgIGZpbGwgPSAiUG9uZCBOYW1lIikgKyAgIyBMYWJlbHMgZm9yIGxlZ2VuZAogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDI0KSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMiksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpNb2RlbEVycm9yUGxvdF9DUkQ4NQoKZ2dzYXZlKCJDb3JyX0Vycm9yX0NSRDg1LnBuZyIsIHBsb3QgPSBNb2RlbEVycm9yUGxvdF9DUkQ4NSwgd2lkdGggPSA5LCBoZWlnaHQgPSA2KQpgYGAKCiMjIyBDYWxjdWxhdGluZyBOU0UgdmFsdWVzCmBgYHtyfQpNb2RfQ1JEODUKCiMgRmlsdGVyIHRoaXMgdG8gb25seSB0aGUgb2JzZXJ2YXRpb25hbCBkYXRhCm9ic19DUkQ4NSA8LSBNb2RfQ1JEODUgJT4lCiAgZmlsdGVyKHRpbWUgPCBhcy5EYXRlKCIyMDIwLTAxLTAxIikpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBhcy5kYXRhLmZyYW1lKCkKCiMgQ29udmVydCB0aGUgJ2RhdGUnIGNvbHVtbiBpbiBDUl9XYXRlclRlbXA4NSB0byBEYXRlIHR5cGUgYW5kIHJlbmFtZSBpdCB0byAndGltZScKQ1JfV2F0ZXJUZW1wODUgPC0gQ1JfV2F0ZXJUZW1wODUgJT4lCiAgbXV0YXRlKHRpbWUgPSBhcy5EYXRlKGRhdGUpKQoKIyBCVlMgIyMjIwpCVlNfQ1JEIDwtIG9ic19DUkQ4NSAlPiUKICBmaWx0ZXIocG9uZF9uYW1lID09ICJCVlMiKQoKIyBQZXJmb3JtIHRoZSBtZXJnZSB0byBjb21iaW5lIHRoZSBkYXRhIGZyYW1lcyBiYXNlZCBvbiB0aGUgdGltZS9kYXRlIGNvbHVtbnMKQlZTX2NvbWJpbmVkIDwtIEJWU19DUkQgJT4lCiAgc2VsZWN0KHRpbWUsIG1lZCkgJT4lCiAgbGVmdF9qb2luKENSX1dhdGVyVGVtcDg1LCBieSA9ICJ0aW1lIikKCkJWU19OU0UgPC0gTlNFKEJWU19jb21iaW5lZCRtZWQsIEJWU19jb21iaW5lZCRCVlMsIG5hLnJtID0gVFJVRSkKQlZTX05TRQoKIyBDQUIgIyMjIwpDQUJfQ1JEIDwtIG9ic19DUkQ4NSAlPiUKICBmaWx0ZXIocG9uZF9uYW1lID09ICJDQUIiKQoKIyBQZXJmb3JtIHRoZSBtZXJnZSB0byBjb21iaW5lIHRoZSBkYXRhIGZyYW1lcyBiYXNlZCBvbiB0aGUgdGltZS9kYXRlIGNvbHVtbnMKQ0FCX2NvbWJpbmVkIDwtIENBQl9DUkQgJT4lCiAgc2VsZWN0KHRpbWUsIG1lZCkgJT4lCiAgbGVmdF9qb2luKENSX1dhdGVyVGVtcDg1LCBieSA9ICJ0aW1lIikKCkNBQl9OU0UgPC0gTlNFKENBQl9jb21iaW5lZCRtZWQsIENBQl9jb21iaW5lZCRDQUIsIG5hLnJtID0gVFJVRSkKQ0FCX05TRQoKIyBDQU4gIyMjIwpDQU5fQ1JEIDwtIG9ic19DUkQ4NSAlPiUKICBmaWx0ZXIocG9uZF9uYW1lID09ICJDQU4iKQoKIyBQZXJmb3JtIHRoZSBtZXJnZSB0byBjb21iaW5lIHRoZSBkYXRhIGZyYW1lcyBiYXNlZCBvbiB0aGUgdGltZS9kYXRlIGNvbHVtbnMKQ0FOX2NvbWJpbmVkIDwtIENBTl9DUkQgJT4lCiAgc2VsZWN0KHRpbWUsIG1lZCkgJT4lCiAgbGVmdF9qb2luKENSX1dhdGVyVGVtcDg1LCBieSA9ICJ0aW1lIikKCkNBTl9OU0UgPC0gTlNFKENBTl9jb21iaW5lZCRtZWQsIENBTl9jb21iaW5lZCRDQU4sIG5hLnJtID0gVFJVRSkKQ0FOX05TRQoKIyBDQU4gIyMjIwpDQU5fQ1JEIDwtIG9ic19DUkQ4NSAlPiUKICBmaWx0ZXIocG9uZF9uYW1lID09ICJDQU4iKQoKIyBQZXJmb3JtIHRoZSBtZXJnZSB0byBjb21iaW5lIHRoZSBkYXRhIGZyYW1lcyBiYXNlZCBvbiB0aGUgdGltZS9kYXRlIGNvbHVtbnMKQ0FOX2NvbWJpbmVkIDwtIENBTl9DUkQgJT4lCiAgc2VsZWN0KHRpbWUsIG1lZCkgJT4lCiAgbGVmdF9qb2luKENSX1dhdGVyVGVtcDg1LCBieSA9ICJ0aW1lIikKCkNBTl9OU0UgPC0gTlNFKENBTl9jb21iaW5lZCRtZWQsIENBTl9jb21iaW5lZCRDQU4sIG5hLnJtID0gVFJVRSkKQ0FOX05TRQpgYGAKCkNsZWFyIG91dCB0aGUgZW52aXJvbm1lbnQgYW5kIHJlbG9hZCB0aGUgYmFzaWNzIGJlZm9yZSBzdGFydGluZyB0aGUgbmV4dCBzZWN0aW9uCgpgYGB7cn0Kcm0obGlzdCA9IGxzKCkpCgpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShyamFncykKbGlicmFyeShnZ3Bsb3QyKQoKc2V0LnNlZWQoMSkKYGBgCgojIENvbnRpbnVlaW5nIHdpdGggWWFrdXRhdCBGb3JlbGFuZHMgKFlGKQoKIyMgUkNQIDQuNQoKIyMjIERlc2lnbiB0aGUgTW9kZWwKClJlYWQgaW4gdGhlIGRhdGEgaGVyZSwgd2hpY2ggaXMgYW4gb3V0cHV0IG9mIFhYIGNvZGUgZmlsZQoKVGhlbiBzZXBhcmF0ZSB0aGUgZGF0YSBpbnRvIGFpciBhbmQgd2F0ZXIgdGVtcGVyYXR1cmUgZmlsZXMKCmBgYHtyfQojIEFpciBhbmQgd2F0ZXIgdGVtcGVyYXR1cmUgZGF0YTogWUYgbG9jYXRpb24sIDQuNSBzY2VuYXJpbwpZRl9UZW1wcyA8LSByZWFkLmNzdigiWUZfNDVTTkFQRm9yZWNhc3RfTW9uQ29yci5jc3YiLCBoZWFkZXI9VFJVRSkKCiMgQWlyIHRlbXBlcmF0dXJlIHZhcmlhYmxlcwpZRl9BaXJUZW1wNDUgPC0gWUZfVGVtcHMgJT4lCiAgc2VsZWN0KGRhdGUsIEFpcnBvcnQsIEFpcl9Nb250aEF2Zywgc3RkLCBwcmVjaXNpb24sIFJlZ2lvbikKCiMgV2F0ZXIgdGVtcGVyYXR1cmUgdmFyaWFibGVzCllGX1dhdGVyVGVtcDQ1IDwtIFlGX1RlbXBzICU+JQogIHNlbGVjdChkYXRlLCBNUDEsIE1QMywgTVA1LCBNUDgsIFBMMSwgUEwyLCBQTDMsIFVCUDEsIFVCUDIsIFVCUDMsIFVCUDQpCgoKIyBTZXQgdXAgYSBzdHJpbmcgb2YgYWxsIHRoZSBkYXRlcwp0aW1lIDwtIFlGX1dhdGVyVGVtcDQ1JGRhdGUKbGVuZ3RoKHRpbWUpCmBgYAoKU2V0dGluZyB1cCB0aGUgcmFuZG9tIHdhbGsgbW9kZWwKCmBgYHtyfQpkbG1fcG9vbGVkIDwtICIKbW9kZWx7CiMjIyMgUHJpb3JzCmZvcihwIGluIDE6bnApewp4WzEscF0gfiBkbm9ybSh4X2ljLCB0YXVfaWMpICMgSW5pdGlhbCBjb25kaXRpb24gb2Ygd2F0ZXIgdGVtcGVyYXR1cmUKfQp0YXVfb2JzIH4gZGdhbW1hKGFfb2JzLCByX29icykgIyBQcmlvciBvbiBvYnNlcnZhdGlvbiBlcnJvcgp0YXVfYWRkIH4gZGdhbW1hKGFfYWRkLCByX2FkZCkgIyBQcmlvciBvbiBwcm9jZXNzIGVycm9yCgojIyMjIEZpeGVkIEVmZmVjdHMKYmV0YSB+IGRtbm9ybShtdV9iZXRhLCB0YXVfYmV0YSkgIyBQcmlvciBvbiBiZXRhIGNvZWZmaWNpZW50cwoKZm9yKHAgaW4gMTpucCl7CmludFtwXSB+IGRub3JtKG11X2ludCwgdGF1X2ludCkgIyBQcmlvciBvbiBwb25kLXNwZWNpZmljIGludGVyY2VwdHMKfQoKIyMjIyBEYXRhIE1vZGVsCmZvcih0IGluIDE6bil7ICMgbG9vcCBvdmVyIGFsbCB0aW1lIHN0ZXBzCmZvcihwIGluIDE6bnApewpPQlNbdCxwXSB+IGRub3JtKHhbdCxwXSwgdGF1X29icykgIyBPYnNlcnZlZCB3YXRlciB0ZW1wZXJhdHVyZSBpcyBkcmF3biBmcm9tIGxhdGVudCBhaXIgdGVtcGVyYXR1cmUgd2l0aCBvYnNlcnZhdGlvbiB1bmNlcnRhaW50eQp9ClhmW3RdIH4gZG5vcm0obXVBaXJUZW1wW3RdLCB0YXVBaXJUZW1wW3RdKSAjIExhdGVudCBhaXIgdGVtcGVyYXR1cmUgaXMgZHJhd24gZnJvbSBtZWFuIGFuZCBwcmVjaXNpb24gb2YgZm9yZWNhc2F0ZWQgYWlyIHRlbXBlcmF0dXJlCn0KCiMjIyMgUHJvY2VzcyBNb2RlbApmb3IodCBpbiAyOm4peyAjIGxvb3Agb3ZlciBhbGwgdGltZSBzdGVwcyBleGNlcHQgdGVoIGZpcnN0ICh3ZSBkZWZpbmVkIGljIGFib3ZlKQpmb3IocCBpbiAxOm5wKXsKbXVbdCxwXSA8LSB4W3QtMSxwXSArIGludFtwXSArIGJldGFbMV0gKiB4W3QtMSxwXSArIGJldGFbMl0gKiBYZlt0XSAjIE1lYW4gd2F0ZXIgdGVtcGVyYXR1cmUgaXMgYSBmdW5jdGlvbiBvZiB0aGUgcHJldmlvdXMgdGltZSBzdGVwIGFuZCBjdXJyZW50IGFpciB0ZW1wZXJhdHVyZQp4W3QscF0gfiBkbm9ybShtdVt0LHBdLCB0YXVfYWRkKSAjIExhdGVudCB3YXRlciB0ZW1wZXJhdHVyZSBpcyBkcmF3biBmcm9tIG1lYW4gd2F0ZXIgdGVtcGVyYXR1cmUgd2l0aCBwcm9jZXNzIHVuY2VydGFpbnR5Cn0KfQp9CiIKYGBgCgpEZWZpbmUgdGhlIGRhdGEgYW5kIHByaW9ycyBmb3IgdGhlIG1vZGVsCgpgYGB7cn0KIyBFbXB0eSBsaXN0CmRhdGEgPC0gbGlzdCgpCiMgV2F0ZXIgdGVtcGVyYXR1cmUgb2JzZXJ2YXRpb25zCmRhdGEkT0JTIDwtIGRwbHlyOjpzZWxlY3QoWUZfV2F0ZXJUZW1wNDUsIC1kYXRlKQojIE51bWJlciBvZiB0aW1lIHN0ZXBzCmRhdGEkbiA8LSBucm93KGRhdGEkT0JTKQojIE51bWJlciBvZiBwb25kcwpkYXRhJG5wIDwtIG5jb2woZGF0YSRPQlMpCiMgSW5pdGlhbCB3YXRlciB0ZW1wZXJhdHVyZSBtZWFuCmRhdGEkeF9pYyA8LSAwLjEKIyBJbml0aWFsIHdhdGVyIHRlbXBlcmF0dXJlIHByZWNpc2lvbgpkYXRhJHRhdV9pYyA9IDAuMQojIFByaW9yIHBhcmFtZXRlcnMgZm9yIG9ic2VydmF0aW9uIGFuZCBwcm9jZXNzIHVuY2VydGFpbnR5CmRhdGEkYV9vYnMgPSAxCmRhdGEkcl9vYnMgPSAxCmRhdGEkYV9hZGQgPSAxCmRhdGEkcl9hZGQgPSAxCiMgUHJpb3IgcGFyYW1ldGVycyBmb3IgYmV0YSBjb2VmZmljaWVudHMKZGF0YSRtdV9iZXRhIDwtIGMoMCwgMCkKZGF0YSR0YXVfYmV0YSA8LSBkaWFnKHggPSBjKDAuMDAxLCAwLjAwMSksIG5yb3cgPSAyLCBuY29sID0gMikKIyBQcmlvciBwYXJhbWV0ZXJzIGZvciBpbnRlcmNlcHQKZGF0YSRtdV9pbnQgPC0gMApkYXRhJHRhdV9pbnQgPC0gMC4wMDEKIyBNZWFuIGFpciB0ZW1wZXJhdHVyZSBlc3RpbWF0ZQpkYXRhJG11QWlyVGVtcCA8LSBZRl9BaXJUZW1wNDUkQWlyX01vbnRoQXZnCiMgQWlyIHRlbXBlcmF0dXJlIHByZWNpc2lvbgpkYXRhJHRhdUFpclRlbXAgPC0gWUZfQWlyVGVtcDQ1JHByZWNpc2lvbgoKYGBgCgpDcmVhdGUgSkFHUyBtb2RlbCB3aXRoIDMgY2hhaW5zCgpgYGB7cn0Kam0gPC0gamFncy5tb2RlbChmaWxlID0gdGV4dENvbm5lY3Rpb24oZGxtX3Bvb2xlZCksIGRhdGEgPSBkYXRhLCBuLmNoYWlucyA9IDMpCmBgYAoKUG9zdGVyaW9yIHNhbXBsZXMgb2YgcGFyYW1ldGVycwoKYGBge3J9CllGNDVfb3V0X3BhcmFtcyA8LSBjb2RhLnNhbXBsZXMobW9kZWwgPSBqbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWVzID0gYygnYmV0YScsICdpbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0YXVfYWRkJywgJ3RhdV9vYnMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uaXRlciA9IDEwMDAwMCwgdGhpbiA9IDI1KQpgYGAKClBvc3RlcmlvciBzYW1wbGVzIG9mIHJlc3BvbnNlIHZhcmlhYmxlcwoKYGBge3J9CllGNDVfb3V0X3Jlc3BvbnNlIDwtIGNvZGEuc2FtcGxlcyhtb2RlbCA9IGptLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lcyA9IGMoJ3gnLCAnT0JTJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uaXRlciA9IDEwMDAwMCwgdGhpbiA9IDI1KQpgYGAKCkEgY291cGxlIHF1aWNrIGNoZWNrcyBoZXJlCgpgYGB7cn0KIyBwbG90KFlGNDVfb3V0X3BhcmFtcykKZ2VsbWFuLmRpYWcoWUY0NV9vdXRfcGFyYW1zLCBjb25maWRlbmNlID0gMC45OSkKCmBgYAoKVmlzdWFsaXplIHRoZSBvdXRwdXQgYnkganVzdCBsb29raW5nIGF0IHRoZSAqKjk1JSBjcmVkaWJsZSBpbnRlcnZhbCBvZiB0aGUgdGltZS1zZXJpZXMgb2YgWCdzKiogYW5kIGNvbXBhcmUgdGhhdCB0byB0aGUgb2JzZXJ2ZWQgWSdzCgpUcmFuc2Zvcm0gdGhlIHNhbXBsZXMgYmFjayBmcm9tIHRoZSBsb2cgZG9tYWluIHRvIHRoZSBsaW5lYXIgZG9tYWluCgpgYGB7cn0KdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyBhZGp1c3QgdG8gem9vbSBpbiBhbmQgb3V0CnRpbWUgPC1hcy5EYXRlKHRpbWUpCm91dCA8LSBhcy5tYXRyaXgoWUY0NV9vdXRfcmVzcG9uc2UpICAgICAgICAgIyMgY29udmVydCBmcm9tIGNvZGEgdG8gbWF0cml4CmBgYAoKY29kZSBmcm9tIEFNVyBmb3Igc3BsaXR0aW5nIHVwIHRoaXMgbWF0cml4CmBgYHtyfQp4X2NvbHMgPC0gZ3JlcCgnXngnLCBjb2xuYW1lcyhvdXQpKQpvYnNfY29scyA8LSBncmVwKCdeT0JTJywgY29sbmFtZXMob3V0KSkKCm91dF94IDwtIG91dFsseF9jb2xzXQpvdXRfb2JzIDwtIG91dFssb2JzX2NvbHNdCgpybShvdXQpCgpvdXRfeCA8LSB0KG91dF94KQoKb3V0X3ggPC0gYXMuZGF0YS5mcmFtZShvdXRfeCkKb3V0X3gyIDwtIG91dF94IHw+CiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gJ3RpbWVfcG9uZCcpIHw+CiAgZHBseXI6Om11dGF0ZSh0aW1lc3RlcCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKnhcXFsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJyksCiAgICAgICAgICAgICAgICB0aW1lc3RlcCA9IHN1Yih4ID0gdGltZXN0ZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJywuKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHRpbWVfcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKiwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHBvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnXFxdJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJykpIHw+CiAgdGlkeXI6OnBpdm90X2xvbmdlcigtYyh0aW1lX3BvbmQsIHRpbWVzdGVwLCBwb25kKSwKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gJ2l0ZXInLCB2YWx1ZXNfdG8gPSAndmFsJykgfD4KICBkcGx5cjo6Z3JvdXBfYnkocG9uZCwgdGltZXN0ZXApIHw+CiAgZHBseXI6OnN1bW1hcml6ZShsb3cgPSBxdWFudGlsZSh2YWwsIHByb2JzID0gMC4wMjUpLAogICAgICAgICAgICAgICAgICAgbWVkID0gbWVkaWFuKHZhbCksCiAgICAgICAgICAgICAgICAgICBoaWdoID0gcXVhbnRpbGUodmFsLCBwcm9icyA9IDAuOTc1KSkKCnRpbWVzdGVwcyA8LSBhcy5kYXRhLmZyYW1lKHRpbWUpCnRpbWVzdGVwcyRpbmQgPC0gYXMuY2hhcmFjdGVyKHNlcShmcm9tID0gMSwgdG8gPSBucm93KHRpbWVzdGVwcyksIGJ5ID0gMSkpCmNvbG5hbWVzKHRpbWVzdGVwcykgPC0gYygndGltZScsICd0aW1lc3RlcCcpCgpwb25kcyA8LSBhcy5kYXRhLmZyYW1lKGNvbG5hbWVzKFlGX1dhdGVyVGVtcDQ1Wy0xXSkpCnBvbmRzJGluZCA8LSBhcy5jaGFyYWN0ZXIoc2VxKGZyb20gPSAxLCB0byA9IG5yb3cocG9uZHMpLCBieSA9IDEpKQpjb2xuYW1lcyhwb25kcykgPC0gYygncG9uZF9uYW1lJywgJ3BvbmQnKQoKb3V0X3hfbWFwcGVkIDwtIG91dF94MiB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHRpbWVzdGVwcywgYnkgPSAndGltZXN0ZXAnKSB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHBvbmRzLCBieSA9ICdwb25kJykgfD4KICBkcGx5cjo6c2VsZWN0KGxvdywgbWVkLCBoaWdoLCB0aW1lLCBwb25kX25hbWUpCgpwWCA8LSBvdXRfeF9tYXBwZWQgfD4KICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeSA9IG1lZCkpICsKICBnZ3Bsb3QyOjpnZW9tX3JpYmJvbihnZ3Bsb3QyOjphZXMoeCA9IHRpbWUsIHltaW4gPSBsb3csIHltYXggPSBoaWdoKSkgKwogIGdncGxvdDI6OmZhY2V0X3dyYXAofnBvbmRfbmFtZSkKCm91dF9vYnMgPC0gdChvdXRfb2JzKQoKb3V0X29icyA8LSBhcy5kYXRhLmZyYW1lKG91dF9vYnMpCgpvdXRfb2JzMiA8LSBvdXRfb2JzIHw+CiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gJ3RpbWVfcG9uZCcpIHw+CiAgZHBseXI6Om11dGF0ZSh0aW1lc3RlcCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKk9CU1xcWycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHRpbWVzdGVwID0gc3ViKHggPSB0aW1lc3RlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLC4qJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJy4qLCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICdcXF0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSkgfD4KICB0aWR5cjo6cGl2b3RfbG9uZ2VyKC1jKHRpbWVfcG9uZCwgdGltZXN0ZXAsIHBvbmQpLAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAnaXRlcicsIHZhbHVlc190byA9ICd2YWwnKSB8PgogIGRwbHlyOjpncm91cF9ieShwb25kLCB0aW1lc3RlcCkgfD4KICBkcGx5cjo6c3VtbWFyaXplKGxvdyA9IHF1YW50aWxlKHZhbCwgcHJvYnMgPSAwLjAyNSksCiAgICAgICAgICAgICAgICAgICBtZWQgPSBtZWRpYW4odmFsKSwKICAgICAgICAgICAgICAgICAgIGhpZ2ggPSBxdWFudGlsZSh2YWwsIHByb2JzID0gMC45NzUpKQoKb3V0X29ic19tYXBwZWQgPC0gb3V0X29iczIgfD4KICBkcGx5cjo6bGVmdF9qb2luKHkgPSB0aW1lc3RlcHMsIGJ5ID0gJ3RpbWVzdGVwJykgfD4KICBkcGx5cjo6bGVmdF9qb2luKHkgPSBwb25kcywgYnkgPSAncG9uZCcpIHw+CiAgZHBseXI6OnNlbGVjdChsb3csIG1lZCwgaGlnaCwgdGltZSwgcG9uZF9uYW1lKQoKcE9CUyA8LSBvdXRfb2JzX21hcHBlZCB8PgogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoZ2dwbG90Mjo6YWVzKHggPSB0aW1lLCB5ID0gbWVkKSkgKwogIGdncGxvdDI6Omdlb21fcmliYm9uKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeW1pbiA9IGxvdywgeW1heCA9IGhpZ2gpKSArCiAgZ2dwbG90Mjo6ZmFjZXRfd3JhcCh+cG9uZF9uYW1lKQoKY293cGxvdDo6cGxvdF9ncmlkKHBYLCBwT0JTKQpgYGAKCiMjIyBQcm9iYWJpbGl0eSBvZiBDcm9zc2luZyBUaHJlc2hvbGQKCmBgYHtyfQp0aHJlc2hvbGRfcHJvYnMgPC0gb3V0X29icyB8PgogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICd0aW1lX3BvbmQnKSB8PgogIGRwbHlyOjptdXRhdGUodGltZXN0ZXAgPSBzdWIoeCA9IHRpbWVfcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLipPQlNcXFsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJyksCiAgICAgICAgICAgICAgICB0aW1lc3RlcCA9IHN1Yih4ID0gdGltZXN0ZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJywuKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHRpbWVfcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKiwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHBvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnXFxdJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJykpIHw+CiAgdGlkeXI6OnBpdm90X2xvbmdlcigtYyh0aW1lX3BvbmQsIHRpbWVzdGVwLCBwb25kKSwKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gJ2l0ZXInLCB2YWx1ZXNfdG8gPSAndmFsJykgfD4KICBkcGx5cjo6Z3JvdXBfYnkocG9uZCwgdGltZXN0ZXApIHw+CiAgZHBseXI6OnN1bW1hcml6ZShuX2l0ZXIgPSBkcGx5cjo6bigpLAogICAgICAgICAgICAgICAgICAgbl90aHJlc2ggPSBzdW0odmFsID4gMjApLAogICAgICAgICAgICAgICAgICAgcHJvYiA9IChuX3RocmVzaCAvIG5faXRlcikgKiAxMDApCgp0aHJlc2hvbGRfcHJvYnNfbWFwcGVkIDwtIHRocmVzaG9sZF9wcm9icyB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHRpbWVzdGVwcywgYnkgPSAndGltZXN0ZXAnKSB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHBvbmRzLCBieSA9ICdwb25kJykKCnRocmVzaG9sZF9wcm9ic19tYXBwZWQgfD4KICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeSA9IHByb2IpKSArCiAgZ2dwbG90Mjo6ZmFjZXRfd3JhcCh+cG9uZF9uYW1lKQpgYGAKClNhdmUgdGhlc2Ugb3VwdXRzIHVzaW5nIGEgLlJEYXRhRmlsZSB0eXBlCgpgYGB7cn0Kc2F2ZS5pbWFnZShmaWxlID0gIkNvcnJfUG9vbGVkTW9kX1lGNDUuUkRhdGEiKQoKI0N1cnJlbnRseSB0aGlzIGhhcyBhbGwgdGhlIGluZm9ybWF0aW9uIGluIGl0LiBFdmVudHVhbGx5IGNvdWxkIGxpbWl0IHRoaXMgdG8gYmUganVzdCB0aGUgcmVsYXZlbnQgaW5mb3JtYXRpb24gZm9yIHRoZSByZW1haW5pbmcgY29kZSBiZWxvdwpgYGAKCiMjIyBNYWtpbmcgR3JhcGhzCgpMb2FkIGluIHRoaXMgZmlsZSBoZXJlIGFzIGxvbmcgYXMgbm8gY29kZSBjaGFuZ2VzIGFyZSBuZWVkZWQgYWJvdmUKCmBgYHtyfQpsb2FkKGZpbGUgPSAiQ29ycl9Qb29sZWRNb2RfWUY0NS5SRGF0YSIpCmBgYAoKQ3JlYXRpbmcgc29tZSBuaWNlIHBsb3RzIG9mIHRoZXNlCgoxLiBjb2xvcmVkIHBhbmVsIHBsb3QgKGVhY2ggcG9uZHMgZm9yZWNhc3Qgd2l0aCB0aGUgbWVkaWFuLCBoaWdoLCBhbmQgbG93IHBsdXMgYSB0cmVuZCBsaW5lKQpgYGB7cn0KIyBzZXQgdXAgdGhlIGNvbG9ycyBoZXJlIGZvciB0aGUgcGxvdHMgYmVsb3cgc28gdGhhdCBlYWNoIHBvbmQgaGFzIHRoZSBzYW1lIGNvbG9yIGVhY2ggdGltZQpNb2RfWUY0NSA8LSBvdXRfb2JzX21hcHBlZApzdHIoTW9kX1lGNDUpCndyaXRlLmNzdihNb2RfWUY0NSwgIk1vZF9ZRjQ1LmNzdiIpCgojIERlZmluZSB0aGUgY3VzdG9tIGNvbG9yIHBhbGV0dGUKWUZfY29sb3JzIDwtIGMoIiNFNDFBMUMiLCAiIzM3N0VCOCIsICIjNERBRjRBIiwgIiM5ODRFQTMiLCAiI0ZGN0YwMCIsICIjRkZGRjMzIiwgIiNBNjU2MjgiLCAiI0Y3ODFCRiIsICJsaWdodGJsdWUiLCAibGlnaHRncmVlbiIsICIjNkEzRDlBIikKCiMgRW5zdXJlIHRoYXQgWUZfY29sb3JzIGhhcyB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIG51bWJlciBvZiB1bmlxdWUgcG9uZHMKdW5pcXVlX3BvbmRzIDwtIHVuaXF1ZShNb2RfWUY0NSRwb25kX25hbWUpCmlmIChsZW5ndGgoWUZfY29sb3JzKSAhPSBsZW5ndGgodW5pcXVlX3BvbmRzKSkgewogIHN0b3AoIlRoZSBudW1iZXIgb2YgY29sb3JzIGluIFlGX2NvbG9ycyBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBwb25kcy4iKQp9CgojIENyZWF0ZSBhIG5hbWVkIHZlY3RvciBmb3IgWUZfY29sb3JzIHdpdGggcG9uZCBuYW1lcwpjb2xvcl9tYXBwaW5nIDwtIHNldE5hbWVzKFlGX2NvbG9ycywgdW5pcXVlX3BvbmRzKQoKIyBQbG90dGluZwpQb25kc19ZRjQ1IDwtIGdncGxvdChkYXRhID0gTW9kX1lGNDUsIGFlcyh4ID0gdGltZSkpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGxvdywgeW1heCA9IGhpZ2gsIGZpbGwgPSBwb25kX25hbWUpKSArICAjIEFkZCB0aGUgcmliYm9uIHdpdGggY29sb3JzCiAgZ2VvbV9saW5lKGFlcyh5ID0gbWVkLCBjb2xvciA9IHBvbmRfbmFtZSkpICsgICMgRW5zdXJlIGxpbmVzIGFyZSB2aXNpYmxlIGFuZCBjb2xvcmVkIGJ5IHBvbmQKICBnZW9tX3Ntb290aChhZXMoeSA9IG1lZCwgY29sb3IgPSAiZ3JleSIpLCBzaXplID0gMSkgKyAgIyBFbnN1cmUgbGluZXMgYXJlIHZpc2libGUgYW5kIGNvbG9yZWQgYnkgcG9uZAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGFzLkRhdGUoIjIwMjAtMTItMDEiKSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAicmVkIikgKyAgIyBBZGQgdmVydGljYWwgZGFzaGVkIHJlZCBsaW5lCiAgZmFjZXRfd3JhcCh+IHBvbmRfbmFtZSkgKyAgIyBGYWNldCBieSBwb25kX25hbWUKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfbWFwcGluZykgKyAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgbGluZXMKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgcmliYm9ucwogIHhsYWIoIlllYXIiKSArCiAgeWxhYigiV2F0ZXIgVGVtcGVyYXR1cmUgKMKwQykiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjQpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpClBvbmRzX1lGNDUKCmdnc2F2ZSgiQ29ycl9JbmRQb25kc19ZRjQ1LnBuZyIsIHBsb3QgPSBQb25kc19ZRjQ1LCB3aWR0aCA9IDgsIGhlaWdodCA9IDYpCmBgYAoKMi4gVHJlbmQgYnkgcG9uZCAoZ2VvbSBzbW9vdGggZm9yIGVhY2ggcG9uZCBvbiB0aGUgc2FtZSBwbG90IGZvciBjb21wYXJpc29uKQoKYGBge3J9CiMgdXNpbmcgdGhlIHNhbWUgYWVzdGV0aWNzIGFzIGFib3ZlCgpUcmVuZHNfWUY0NSA8LSBnZ3Bsb3QoZGF0YSA9IE1vZF9ZRjQ1LCBhZXMoeCA9IHRpbWUpKSArCiAgZ2VvbV9zbW9vdGgoYWVzKHkgPSBtZWQsIGNvbG9yID0gcG9uZF9uYW1lLCBmaWxsID0gcG9uZF9uYW1lKSwgYWxwaGEgPSAwLjE1LCBzaXplID0gMSkgKyAgIyBTbW9vdGggbGluZXMgd2l0aCBjb2xvcnMgYnkgcG9uZF9uYW1lCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX21hcHBpbmcpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgcmliYm9ucwogIGxhYnMoCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgeSA9ICJXYXRlciBUZW1wZXJhdHVyZSAowrBDKSIsCiAgICAgICBjb2xvciA9ICJQb25kIE5hbWUiLAogICAgICAgZmlsbCA9ICJQb25kIE5hbWUiKSArICAjIExhYmVscyBmb3IgbGVnZW5kCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTgpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksICMgQ2hhbmdlIHRoZSBsZWdlbmQgdGV4dCBzaXplIGhlcmUKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkKVHJlbmRzX1lGNDUKCmdnc2F2ZSgiQ29ycl9JbmRUcmVuZHNfWUY0NS5wbmciLCBwbG90ID0gVHJlbmRzX1lGNDUsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNikKCmBgYAoKMy4gcHJvYmFiaWxpdHkgcGxvdCAoYnkgcG9uZCkKCmBgYHtyfQpwcm9ic19ZRjQ1IDwtIHRocmVzaG9sZF9wcm9ic19tYXBwZWQKd3JpdGUuY3N2KHByb2JzX1lGNDUsICJwcm9ic19ZRjQ1LmNzdiIpCgpQcm9iczIwX1lGNDUgPC0gZ2dwbG90KGRhdGEgPSBwcm9ic19ZRjQ1LCBhZXMoeCA9IHRpbWUpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gcHJvYiwgY29sb3IgPSBwb25kX25hbWUpKSArICAjIEVuc3VyZSBsaW5lcyBhcmUgdmlzaWJsZSBhbmQgY29sb3JlZCBieSBwb25kCiAgZmFjZXRfd3JhcCh+IHBvbmRfbmFtZSkgKyAgIyBGYWNldCBieSBwb25kX25hbWUKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfbWFwcGluZykgKyAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgbGluZXMKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoIlByb2JhYmlsaXR5IikgKwogIHhsaW0oYXMuRGF0ZShjKCIyMDIwLTEyLTAxIiwgIjIwOTktMTItMDEiKSkpICsKICB5bGltKDAsMTAwKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjQpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpClByb2JzMjBfWUY0NQoKZ2dzYXZlKCJDb3JyX1Byb2JzMjBfWUY0NS5wbmciLCBwbG90ID0gUHJvYnMyMF9ZRjQ1LCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA2KQpgYGAKCjQuIE1vZGVsIGZpdHMgYnkgcG9uZAoKYGBge3J9Ck1vZF9ZRjQ1CgpNb2RPYnMgPC0gTW9kX1lGNDUgJT4lCiAgZmlsdGVyKHRpbWUgPCAiMjAyMS0wMS0wMSIpCnJhbmdlKE1vZE9icyR0aW1lKQoKRXJyb3JQbG90X1lGNDUgPC0gZ2dwbG90KGRhdGEgPSBNb2RPYnMsIGFlcyh4ID0gdGltZSkpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGxvdywgeW1heCA9IGhpZ2gsIGZpbGwgPSBwb25kX25hbWUpKSArICAjIEFkanVzdCBmaWxsIGNvbG9ycwogIGdlb21fbGluZShhZXMoeSA9IG1lZCksIGNvbG9yID0gImJsYWNrIikgKyAgIyBCbGFjayBsaW5lcyBmb3IgdGhlIG1lZGlhbiB2YWx1ZXMKICBmYWNldF93cmFwKH4gcG9uZF9uYW1lKSArICAjIEZhY2V0IGJ5IHBvbmRfbmFtZQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX21hcHBpbmcpICsgICMgQXBwbHkgY3VzdG9tIGNvbG9yIHBhbGV0dGUgZm9yIHJpYmJvbnMKICBsYWJzKAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiV2F0ZXIgVGVtcGVyYXR1cmUgKMKwQykiLAogICAgICAgY29sb3IgPSAiUG9uZCBOYW1lIiwKICAgICAgIGZpbGwgPSAiUG9uZCBOYW1lIikgKyAgIyBMYWJlbHMgZm9yIGxlZ2VuZAogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiAjIEFuZ2xlIHgtYXhpcyBsYWJlbHMgaWYgbmVlZGVkCiAgKQpFcnJvclBsb3RfWUY0NQoKZ2dzYXZlKCJDb3JyX0Vycm9yX1lGNDUucG5nIiwgcGxvdCA9IEVycm9yUGxvdF9ZRjQ1LCB3aWR0aCA9IDksIGhlaWdodCA9IDYpCmBgYAoKQ2xlYXIgb3V0IHRoZSBlbnZpcm9ubWVudCBhbmQgcmVsb2FkIHRoZSBiYXNpY3MgYmVmb3JlIHN0YXJ0aW5nIHRoZSBuZXh0IHNlY3Rpb24KCmBgYHtyfQpybShsaXN0ID0gbHMoKSkKCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJqYWdzKQpsaWJyYXJ5KGdncGxvdDIpCgpzZXQuc2VlZCgxKQpgYGAKCiMjIFJDUCA4LjUKCiMjIyBEZXNpZ24gdGhlIE1vZGVsCgpSZWFkIGluIHRoZSBkYXRhIGhlcmUsIHdoaWNoIGlzIGFuIG91dHB1dCBvZiBYWCBjb2RlIGZpbGUKClRoZW4gc2VwYXJhdGUgdGhlIGRhdGEgaW50byBhaXIgYW5kIHdhdGVyIHRlbXBlcmF0dXJlIGZpbGVzCgpgYGB7cn0KIyBBaXIgYW5kIHdhdGVyIHRlbXBlcmF0dXJlIGRhdGE6IFlGIGxvY2F0aW9uLCA0LjUgc2NlbmFyaW8KWUZfVGVtcHMgPC0gcmVhZC5jc3YoIllGXzg1U05BUEZvcmVjYXN0X01vbkNvcnIuY3N2IiwgaGVhZGVyPVRSVUUpCgojIEFpciB0ZW1wZXJhdHVyZSB2YXJpYWJsZXMKWUZfQWlyVGVtcDg1IDwtIFlGX1RlbXBzICU+JQogIHNlbGVjdChkYXRlLCBBaXJwb3J0LCBBaXJfTW9udGhBdmcsIHN0ZCwgcHJlY2lzaW9uLCBSZWdpb24pCgojIFdhdGVyIHRlbXBlcmF0dXJlIHZhcmlhYmxlcwpZRl9XYXRlclRlbXA4NSA8LSBZRl9UZW1wcyAlPiUKICBzZWxlY3QoZGF0ZSwgTVAxLCBNUDMsIE1QNSwgTVA4LCBQTDEsIFBMMiwgUEwzLCBVQlAxLCBVQlAyLCBVQlAzLCBVQlA0KQoKCiMgU2V0IHVwIGEgc3RyaW5nIG9mIGFsbCB0aGUgZGF0ZXMKdGltZSA8LSBZRl9XYXRlclRlbXA4NSRkYXRlCmxlbmd0aCh0aW1lKQpgYGAKClNldHRpbmcgdXAgdGhlIHJhbmRvbSB3YWxrIG1vZGVsCgpgYGB7cn0KZGxtX3Bvb2xlZCA8LSAiCm1vZGVsewojIyMjIFByaW9ycwpmb3IocCBpbiAxOm5wKXsKeFsxLHBdIH4gZG5vcm0oeF9pYywgdGF1X2ljKSAjIEluaXRpYWwgY29uZGl0aW9uIG9mIHdhdGVyIHRlbXBlcmF0dXJlCn0KdGF1X29icyB+IGRnYW1tYShhX29icywgcl9vYnMpICMgUHJpb3Igb24gb2JzZXJ2YXRpb24gZXJyb3IKdGF1X2FkZCB+IGRnYW1tYShhX2FkZCwgcl9hZGQpICMgUHJpb3Igb24gcHJvY2VzcyBlcnJvcgoKIyMjIyBGaXhlZCBFZmZlY3RzCmJldGEgfiBkbW5vcm0obXVfYmV0YSwgdGF1X2JldGEpICMgUHJpb3Igb24gYmV0YSBjb2VmZmljaWVudHMKCmZvcihwIGluIDE6bnApewppbnRbcF0gfiBkbm9ybShtdV9pbnQsIHRhdV9pbnQpICMgUHJpb3Igb24gcG9uZC1zcGVjaWZpYyBpbnRlcmNlcHRzCn0KCiMjIyMgRGF0YSBNb2RlbApmb3IodCBpbiAxOm4peyAjIGxvb3Agb3ZlciBhbGwgdGltZSBzdGVwcwpmb3IocCBpbiAxOm5wKXsKT0JTW3QscF0gfiBkbm9ybSh4W3QscF0sIHRhdV9vYnMpICMgT2JzZXJ2ZWQgd2F0ZXIgdGVtcGVyYXR1cmUgaXMgZHJhd24gZnJvbSBsYXRlbnQgYWlyIHRlbXBlcmF0dXJlIHdpdGggb2JzZXJ2YXRpb24gdW5jZXJ0YWludHkKfQpYZlt0XSB+IGRub3JtKG11QWlyVGVtcFt0XSwgdGF1QWlyVGVtcFt0XSkgIyBMYXRlbnQgYWlyIHRlbXBlcmF0dXJlIGlzIGRyYXduIGZyb20gbWVhbiBhbmQgcHJlY2lzaW9uIG9mIGZvcmVjYXNhdGVkIGFpciB0ZW1wZXJhdHVyZQp9CgojIyMjIFByb2Nlc3MgTW9kZWwKZm9yKHQgaW4gMjpuKXsgIyBsb29wIG92ZXIgYWxsIHRpbWUgc3RlcHMgZXhjZXB0IHRlaCBmaXJzdCAod2UgZGVmaW5lZCBpYyBhYm92ZSkKZm9yKHAgaW4gMTpucCl7Cm11W3QscF0gPC0geFt0LTEscF0gKyBpbnRbcF0gKyBiZXRhWzFdICogeFt0LTEscF0gKyBiZXRhWzJdICogWGZbdF0gIyBNZWFuIHdhdGVyIHRlbXBlcmF0dXJlIGlzIGEgZnVuY3Rpb24gb2YgdGhlIHByZXZpb3VzIHRpbWUgc3RlcCBhbmQgY3VycmVudCBhaXIgdGVtcGVyYXR1cmUKeFt0LHBdIH4gZG5vcm0obXVbdCxwXSwgdGF1X2FkZCkgIyBMYXRlbnQgd2F0ZXIgdGVtcGVyYXR1cmUgaXMgZHJhd24gZnJvbSBtZWFuIHdhdGVyIHRlbXBlcmF0dXJlIHdpdGggcHJvY2VzcyB1bmNlcnRhaW50eQp9Cn0KfQoiCmBgYAoKRGVmaW5lIHRoZSBkYXRhIGFuZCBwcmlvcnMgZm9yIHRoZSBtb2RlbAoKYGBge3J9CiMgRW1wdHkgbGlzdApkYXRhIDwtIGxpc3QoKQojIFdhdGVyIHRlbXBlcmF0dXJlIG9ic2VydmF0aW9ucwpkYXRhJE9CUyA8LSBkcGx5cjo6c2VsZWN0KFlGX1dhdGVyVGVtcDg1LCAtZGF0ZSkKIyBOdW1iZXIgb2YgdGltZSBzdGVwcwpkYXRhJG4gPC0gbnJvdyhkYXRhJE9CUykKIyBOdW1iZXIgb2YgcG9uZHMKZGF0YSRucCA8LSBuY29sKGRhdGEkT0JTKQojIEluaXRpYWwgd2F0ZXIgdGVtcGVyYXR1cmUgbWVhbgpkYXRhJHhfaWMgPC0gMC4xCiMgSW5pdGlhbCB3YXRlciB0ZW1wZXJhdHVyZSBwcmVjaXNpb24KZGF0YSR0YXVfaWMgPSAwLjEKIyBQcmlvciBwYXJhbWV0ZXJzIGZvciBvYnNlcnZhdGlvbiBhbmQgcHJvY2VzcyB1bmNlcnRhaW50eQpkYXRhJGFfb2JzID0gMQpkYXRhJHJfb2JzID0gMQpkYXRhJGFfYWRkID0gMQpkYXRhJHJfYWRkID0gMQojIFByaW9yIHBhcmFtZXRlcnMgZm9yIGJldGEgY29lZmZpY2llbnRzCmRhdGEkbXVfYmV0YSA8LSBjKDAsIDApCmRhdGEkdGF1X2JldGEgPC0gZGlhZyh4ID0gYygwLjAwMSwgMC4wMDEpLCBucm93ID0gMiwgbmNvbCA9IDIpCiMgUHJpb3IgcGFyYW1ldGVycyBmb3IgaW50ZXJjZXB0CmRhdGEkbXVfaW50IDwtIDAKZGF0YSR0YXVfaW50IDwtIDAuMDAxCiMgTWVhbiBhaXIgdGVtcGVyYXR1cmUgZXN0aW1hdGUKZGF0YSRtdUFpclRlbXAgPC0gWUZfQWlyVGVtcDg1JEFpcl9Nb250aEF2ZwojIEFpciB0ZW1wZXJhdHVyZSBwcmVjaXNpb24KZGF0YSR0YXVBaXJUZW1wIDwtIFlGX0FpclRlbXA4NSRwcmVjaXNpb24KCmBgYAoKQ3JlYXRlIEpBR1MgbW9kZWwgd2l0aCAzIGNoYWlucwoKYGBge3J9CmptIDwtIGphZ3MubW9kZWwoZmlsZSA9IHRleHRDb25uZWN0aW9uKGRsbV9wb29sZWQpLCBkYXRhID0gZGF0YSwgbi5jaGFpbnMgPSAzKQpgYGAKClBvc3RlcmlvciBzYW1wbGVzIG9mIHBhcmFtZXRlcnMKCmBgYHtyfQpZRjg1X291dF9wYXJhbXMgPC0gY29kYS5zYW1wbGVzKG1vZGVsID0gam0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lcyA9IGMoJ2JldGEnLCAnaW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGF1X2FkZCcsICd0YXVfb2JzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLml0ZXIgPSA1MDAwMCwgdGhpbiA9IDI1KQpgYGAKClBvc3RlcmlvciBzYW1wbGVzIG9mIHJlc3BvbnNlIHZhcmlhYmxlcwoKYGBge3J9CllGODVfb3V0X3Jlc3BvbnNlIDwtIGNvZGEuc2FtcGxlcyhtb2RlbCA9IGptLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lcyA9IGMoJ3gnLCAnT0JTJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uaXRlciA9IDEwMDAwMCwgdGhpbiA9IDI1KQpgYGAKCkEgY291cGxlIHF1aWNrIGNoZWNrcyBoZXJlCgpgYGB7cn0KIyBwbG90KFlGODVfb3V0X3BhcmFtcykKZ2VsbWFuLmRpYWcoWUY4NV9vdXRfcGFyYW1zLCBjb25maWRlbmNlID0gMC45OSkKCmBgYAoKVmlzdWFsaXplIHRoZSBvdXRwdXQgYnkganVzdCBsb29raW5nIGF0IHRoZSAqKjk1JSBDcmVkaWJsZSBpbnRlcnZhbCBvZiB0aGUgdGltZS1zZXJpZXMgb2YgWCdzKiogYW5kIGNvbXBhcmUgdGhhdCB0byB0aGUgb2JzZXJ2ZWQgWSdzCgpUcmFuc2Zvcm0gdGhlIHNhbXBsZXMgYmFjayBmcm9tIHRoZSBsb2cgZG9tYWluIHRvIHRoZSBsaW5lYXIgZG9tYWluCgpgYGB7cn0KdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyBhZGp1c3QgdG8gem9vbSBpbiBhbmQgb3V0CnRpbWUgPC1hcy5EYXRlKHRpbWUpCm91dCA8LSBhcy5tYXRyaXgoWUY4NV9vdXRfcmVzcG9uc2UpICAgICAgICAgIyMgY29udmVydCBmcm9tIGNvZGEgdG8gbWF0cml4CmBgYAoKY29kZSBmcm9tIEFNVyBmb3Igc3BsaXR0aW5nIHVwIHRoaXMgbWF0cml4CmBgYHtyfQp4X2NvbHMgPC0gZ3JlcCgnXngnLCBjb2xuYW1lcyhvdXQpKQpvYnNfY29scyA8LSBncmVwKCdeT0JTJywgY29sbmFtZXMob3V0KSkKCm91dF94IDwtIG91dFsseF9jb2xzXQpvdXRfb2JzIDwtIG91dFssb2JzX2NvbHNdCgpybShvdXQpCgpvdXRfeCA8LSB0KG91dF94KQoKb3V0X3ggPC0gYXMuZGF0YS5mcmFtZShvdXRfeCkKb3V0X3gyIDwtIG91dF94IHw+CiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gJ3RpbWVfcG9uZCcpIHw+CiAgZHBseXI6Om11dGF0ZSh0aW1lc3RlcCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKnhcXFsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJyksCiAgICAgICAgICAgICAgICB0aW1lc3RlcCA9IHN1Yih4ID0gdGltZXN0ZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJywuKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHRpbWVfcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKiwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHBvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnXFxdJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJykpIHw+CiAgdGlkeXI6OnBpdm90X2xvbmdlcigtYyh0aW1lX3BvbmQsIHRpbWVzdGVwLCBwb25kKSwKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gJ2l0ZXInLCB2YWx1ZXNfdG8gPSAndmFsJykgfD4KICBkcGx5cjo6Z3JvdXBfYnkocG9uZCwgdGltZXN0ZXApIHw+CiAgZHBseXI6OnN1bW1hcml6ZShsb3cgPSBxdWFudGlsZSh2YWwsIHByb2JzID0gMC4wMjUpLAogICAgICAgICAgICAgICAgICAgbWVkID0gbWVkaWFuKHZhbCksCiAgICAgICAgICAgICAgICAgICBoaWdoID0gcXVhbnRpbGUodmFsLCBwcm9icyA9IDAuOTc1KSkKCnRpbWVzdGVwcyA8LSBhcy5kYXRhLmZyYW1lKHRpbWUpCnRpbWVzdGVwcyRpbmQgPC0gYXMuY2hhcmFjdGVyKHNlcShmcm9tID0gMSwgdG8gPSBucm93KHRpbWVzdGVwcyksIGJ5ID0gMSkpCmNvbG5hbWVzKHRpbWVzdGVwcykgPC0gYygndGltZScsICd0aW1lc3RlcCcpCgpwb25kcyA8LSBhcy5kYXRhLmZyYW1lKGNvbG5hbWVzKFlGX1dhdGVyVGVtcDg1Wy0xXSkpCnBvbmRzJGluZCA8LSBhcy5jaGFyYWN0ZXIoc2VxKGZyb20gPSAxLCB0byA9IG5yb3cocG9uZHMpLCBieSA9IDEpKQpjb2xuYW1lcyhwb25kcykgPC0gYygncG9uZF9uYW1lJywgJ3BvbmQnKQoKb3V0X3hfbWFwcGVkIDwtIG91dF94MiB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHRpbWVzdGVwcywgYnkgPSAndGltZXN0ZXAnKSB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHBvbmRzLCBieSA9ICdwb25kJykgfD4KICBkcGx5cjo6c2VsZWN0KGxvdywgbWVkLCBoaWdoLCB0aW1lLCBwb25kX25hbWUpCgpwWCA8LSBvdXRfeF9tYXBwZWQgfD4KICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeSA9IG1lZCkpICsKICBnZ3Bsb3QyOjpnZW9tX3JpYmJvbihnZ3Bsb3QyOjphZXMoeCA9IHRpbWUsIHltaW4gPSBsb3csIHltYXggPSBoaWdoKSkgKwogIGdncGxvdDI6OmZhY2V0X3dyYXAofnBvbmRfbmFtZSkKCm91dF9vYnMgPC0gdChvdXRfb2JzKQoKb3V0X29icyA8LSBhcy5kYXRhLmZyYW1lKG91dF9vYnMpCgpvdXRfb2JzMiA8LSBvdXRfb2JzIHw+CiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4odmFyID0gJ3RpbWVfcG9uZCcpIHw+CiAgZHBseXI6Om11dGF0ZSh0aW1lc3RlcCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKk9CU1xcWycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHRpbWVzdGVwID0gc3ViKHggPSB0aW1lc3RlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLC4qJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gdGltZV9wb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJy4qLCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJycpLAogICAgICAgICAgICAgICAgcG9uZCA9IHN1Yih4ID0gcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICdcXF0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSkgfD4KICB0aWR5cjo6cGl2b3RfbG9uZ2VyKC1jKHRpbWVfcG9uZCwgdGltZXN0ZXAsIHBvbmQpLAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAnaXRlcicsIHZhbHVlc190byA9ICd2YWwnKSB8PgogIGRwbHlyOjpncm91cF9ieShwb25kLCB0aW1lc3RlcCkgfD4KICBkcGx5cjo6c3VtbWFyaXplKGxvdyA9IHF1YW50aWxlKHZhbCwgcHJvYnMgPSAwLjAyNSksCiAgICAgICAgICAgICAgICAgICBtZWQgPSBtZWRpYW4odmFsKSwKICAgICAgICAgICAgICAgICAgIGhpZ2ggPSBxdWFudGlsZSh2YWwsIHByb2JzID0gMC45NzUpKQoKb3V0X29ic19tYXBwZWQgPC0gb3V0X29iczIgfD4KICBkcGx5cjo6bGVmdF9qb2luKHkgPSB0aW1lc3RlcHMsIGJ5ID0gJ3RpbWVzdGVwJykgfD4KICBkcGx5cjo6bGVmdF9qb2luKHkgPSBwb25kcywgYnkgPSAncG9uZCcpIHw+CiAgZHBseXI6OnNlbGVjdChsb3csIG1lZCwgaGlnaCwgdGltZSwgcG9uZF9uYW1lKQoKcE9CUyA8LSBvdXRfb2JzX21hcHBlZCB8PgogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoZ2dwbG90Mjo6YWVzKHggPSB0aW1lLCB5ID0gbWVkKSkgKwogIGdncGxvdDI6Omdlb21fcmliYm9uKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeW1pbiA9IGxvdywgeW1heCA9IGhpZ2gpKSArCiAgZ2dwbG90Mjo6ZmFjZXRfd3JhcCh+cG9uZF9uYW1lKQoKY293cGxvdDo6cGxvdF9ncmlkKHBYLCBwT0JTKQpgYGAKCiMjIyBQcm9iYWJpbGl0eSBvZiBDcm9zc2luZyBUaHJlc2hvbGQKCmBgYHtyfQp0aHJlc2hvbGRfcHJvYnMgPC0gb3V0X29icyB8PgogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICd0aW1lX3BvbmQnKSB8PgogIGRwbHlyOjptdXRhdGUodGltZXN0ZXAgPSBzdWIoeCA9IHRpbWVfcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnLipPQlNcXFsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJyksCiAgICAgICAgICAgICAgICB0aW1lc3RlcCA9IHN1Yih4ID0gdGltZXN0ZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJywuKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHRpbWVfcG9uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICcuKiwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9ICcnKSwKICAgICAgICAgICAgICAgIHBvbmQgPSBzdWIoeCA9IHBvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnXFxdJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAnJykpIHw+CiAgdGlkeXI6OnBpdm90X2xvbmdlcigtYyh0aW1lX3BvbmQsIHRpbWVzdGVwLCBwb25kKSwKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gJ2l0ZXInLCB2YWx1ZXNfdG8gPSAndmFsJykgfD4KICBkcGx5cjo6Z3JvdXBfYnkocG9uZCwgdGltZXN0ZXApIHw+CiAgZHBseXI6OnN1bW1hcml6ZShuX2l0ZXIgPSBkcGx5cjo6bigpLAogICAgICAgICAgICAgICAgICAgbl90aHJlc2ggPSBzdW0odmFsID4gMjApLAogICAgICAgICAgICAgICAgICAgcHJvYiA9IChuX3RocmVzaCAvIG5faXRlcikgKiAxMDApCgp0aHJlc2hvbGRfcHJvYnNfbWFwcGVkIDwtIHRocmVzaG9sZF9wcm9icyB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHRpbWVzdGVwcywgYnkgPSAndGltZXN0ZXAnKSB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oeSA9IHBvbmRzLCBieSA9ICdwb25kJykKCnRocmVzaG9sZF9wcm9ic19tYXBwZWQgfD4KICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKGdncGxvdDI6OmFlcyh4ID0gdGltZSwgeSA9IHByb2IpKSArCiAgZ2dwbG90Mjo6ZmFjZXRfd3JhcCh+cG9uZF9uYW1lKQpgYGAKClNhdmUgdGhlc2Ugb3VwdXRzIHVzaW5nIGEgLlJEYXRhRmlsZSB0eXBlCgpgYGB7cn0Kc2F2ZS5pbWFnZShmaWxlID0gIkNvcnJfUG9vbGVkTW9kX1lGODUuUkRhdGEiKQoKI0N1cnJlbnRseSB0aGlzIGhhcyBhbGwgdGhlIGluZm9ybWF0aW9uIGluIGl0LiBFdmVudHVhbGx5IGNvdWxkIGxpbWl0IHRoaXMgdG8gYmUganVzdCB0aGUgcmVsYXZlbnQgaW5mb3JtYXRpb24gZm9yIHRoZSByZW1haW5pbmcgY29kZSBiZWxvdwpgYGAKCiMjIyBNYWtpbmcgR3JhcGhzCgpMb2FkIGluIHRoaXMgZmlsZSBoZXJlIGFzIGxvbmcgYXMgbm8gY29kZSBjaGFuZ2VzIGFyZSBuZWVkZWQgYWJvdmUKCmBgYHtyfQpsb2FkKGZpbGUgPSAiQ29ycl9Qb29sZWRNb2RfWUY4NS5SRGF0YSIpCmBgYAoKQ3JlYXRpbmcgc29tZSBuaWNlIHBsb3RzIG9mIHRoZXNlCgoxLiBjb2xvcmVkIHBhbmVsIHBsb3QgKGVhY2ggcG9uZHMgZm9yZWNhc3Qgd2l0aCB0aGUgbWVkaWFuLCBoaWdoLCBhbmQgbG93IHBsdXMgYSB0cmVuZCBsaW5lKQpgYGB7cn0KIyBzZXQgdXAgdGhlIGNvbG9ycyBoZXJlIGZvciB0aGUgcGxvdHMgYmVsb3cgc28gdGhhdCBlYWNoIHBvbmQgaGFzIHRoZSBzYW1lIGNvbG9yIGVhY2ggdGltZQpNb2RfWUY4NSA8LSBvdXRfb2JzX21hcHBlZApzdHIoTW9kX1lGODUpCndyaXRlLmNzdihNb2RfWUY4NSwgIk1vZF9ZRjg1LmNzdiIpCgojIERlZmluZSB0aGUgY3VzdG9tIGNvbG9yIHBhbGV0dGUKWUZfY29sb3JzIDwtIGMoIiNFNDFBMUMiLCAiIzM3N0VCOCIsICIjNERBRjRBIiwgIiM5ODRFQTMiLCAiI0ZGN0YwMCIsICIjRkZGRjMzIiwgIiNBNjU2MjgiLCAiI0Y3ODFCRiIsICJsaWdodGJsdWUiLCAibGlnaHRncmVlbiIsICIjNkEzRDlBIikKCiMgRW5zdXJlIHRoYXQgWUZfY29sb3JzIGhhcyB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIG51bWJlciBvZiB1bmlxdWUgcG9uZHMKdW5pcXVlX3BvbmRzIDwtIHVuaXF1ZShNb2RfWUY4NSRwb25kX25hbWUpCmlmIChsZW5ndGgoWUZfY29sb3JzKSAhPSBsZW5ndGgodW5pcXVlX3BvbmRzKSkgewogIHN0b3AoIlRoZSBudW1iZXIgb2YgY29sb3JzIGluIFlGX2NvbG9ycyBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBwb25kcy4iKQp9CgojIENyZWF0ZSBhIG5hbWVkIHZlY3RvciBmb3IgWUZfY29sb3JzIHdpdGggcG9uZCBuYW1lcwpjb2xvcl9tYXBwaW5nIDwtIHNldE5hbWVzKFlGX2NvbG9ycywgdW5pcXVlX3BvbmRzKQoKIyBQbG90dGluZwpQb25kc19ZRjg1IDwtIGdncGxvdChkYXRhID0gTW9kX1lGODUsIGFlcyh4ID0gdGltZSkpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGxvdywgeW1heCA9IGhpZ2gsIGZpbGwgPSBwb25kX25hbWUpKSArICAjIEFkZCB0aGUgcmliYm9uIHdpdGggY29sb3JzCiAgZ2VvbV9saW5lKGFlcyh5ID0gbWVkLCBjb2xvciA9IHBvbmRfbmFtZSkpICsgICMgRW5zdXJlIGxpbmVzIGFyZSB2aXNpYmxlIGFuZCBjb2xvcmVkIGJ5IHBvbmQKICBnZW9tX3Ntb290aChhZXMoeSA9IG1lZCwgY29sb3IgPSAiZ3JleSIpLCBzaXplID0gMSkgKyAgIyBFbnN1cmUgbGluZXMgYXJlIHZpc2libGUgYW5kIGNvbG9yZWQgYnkgcG9uZAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGFzLkRhdGUoIjIwMjAtMTItMDEiKSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAicmVkIikgKyAgIyBBZGQgdmVydGljYWwgZGFzaGVkIHJlZCBsaW5lCiAgZmFjZXRfd3JhcCh+IHBvbmRfbmFtZSkgKyAgIyBGYWNldCBieSBwb25kX25hbWUKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfbWFwcGluZykgKyAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgbGluZXMKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgcmliYm9ucwogIHhsYWIoIlllYXIiKSArCiAgeWxhYigiV2F0ZXIgVGVtcGVyYXR1cmUgKMKwQykiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjQpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpClBvbmRzX1lGODUKCmdnc2F2ZSgiQ29ycl9JbmRQb25kc19ZRjg1LnBuZyIsIHBsb3QgPSBQb25kc19ZRjg1LCB3aWR0aCA9IDgsIGhlaWdodCA9IDYpCgpgYGAKCkNyZWF0ZSBwbG90cyBvZiB0aGUgdHJlbmQgYnkgcG9uZCAoZ2VvbSBzbW9vdGggZm9yIGVhY2ggcG9uZCBvbiB0aGUgc2FtZSBwbG90IGZvciBjb21wYXJpc29uKQoKYGBge3J9CiMgdXNpbmcgdGhlIHNhbWUgYWVzdGV0aWNzIGFzIGFib3ZlCgpUcmVuZHNfWUY4NSA8LSBnZ3Bsb3QoZGF0YSA9IE1vZF9ZRjg1LCBhZXMoeCA9IHRpbWUpKSArCiAgZ2VvbV9zbW9vdGgoYWVzKHkgPSBtZWQsIGNvbG9yID0gcG9uZF9uYW1lLCBmaWxsID0gcG9uZF9uYW1lKSwgYWxwaGEgPSAwLjE1LCBzaXplID0gMSkgKyAgIyBTbW9vdGggbGluZXMgd2l0aCBjb2xvcnMgYnkgcG9uZF9uYW1lCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yX21hcHBpbmcpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgcmliYm9ucwogIGxhYnMoCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgeSA9ICJXYXRlciBUZW1wZXJhdHVyZSAowrBDKSIsCiAgICAgICBjb2xvciA9ICJQb25kIE5hbWUiLAogICAgICAgZmlsbCA9ICJQb25kIE5hbWUiKSArICAjIExhYmVscyBmb3IgbGVnZW5kCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTgpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksICMgQ2hhbmdlIHRoZSBsZWdlbmQgdGV4dCBzaXplIGhlcmUKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkKVHJlbmRzX1lGODUKCmdnc2F2ZSgiQ29ycl9JbmRUcmVuZHNfWUY4NS5wbmciLCBwbG90ID0gVHJlbmRzX1lGODUsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNikKCmBgYAoKMy4gcHJvYmFiaWxpdHkgcGxvdCAoYnkgcG9uZCkKCmBgYHtyfQpwcm9ic19ZRjg1IDwtIHRocmVzaG9sZF9wcm9ic19tYXBwZWQKd3JpdGUuY3N2KHByb2JzX1lGODUsICJwcm9ic19ZRjg1LmNzdiIpCgpQcm9iczIwX1lGODUgPC0gZ2dwbG90KGRhdGEgPSBwcm9ic19ZRjg1LCBhZXMoeCA9IHRpbWUpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gcHJvYiwgY29sb3IgPSBwb25kX25hbWUpKSArICAjIEVuc3VyZSBsaW5lcyBhcmUgdmlzaWJsZSBhbmQgY29sb3JlZCBieSBwb25kCiAgZmFjZXRfd3JhcCh+IHBvbmRfbmFtZSkgKyAgIyBGYWNldCBieSBwb25kX25hbWUKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JfbWFwcGluZykgKyAgIyBVc2UgY3VzdG9tIGNvbG9ycyBmb3IgbGluZXMKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoIlByb2JhYmlsaXR5IikgKwogIHhsaW0oYXMuRGF0ZShjKCIyMDIwLTEyLTAxIiwgIjIwOTktMTItMDEiKSkpICsKICB5bGltKDAsMTAwKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjQpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIyKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpClByb2JzMjBfWUY4NQoKZ2dzYXZlKCJDb3JyX1Byb2JzMjBfWUY4NS5wbmciLCBwbG90ID0gUHJvYnMyMF9ZRjg1LCB3aWR0aCA9IDksIGhlaWdodCA9IDYpCmBgYAoKNC4gTW9kZWwgZml0cyBieSBwb25kCgpgYGB7cn0KTW9kX1lGODUKCk1vZE9icyA8LSBNb2RfWUY4NSAlPiUKICBmaWx0ZXIodGltZSA8ICIyMDIxLTAxLTAxIikKcmFuZ2UoTW9kT2JzJHRpbWUpCgpNb2RlbEVycm9yUGxvdF9ZRjg1IDwtIGdncGxvdChkYXRhID0gTW9kT2JzLCBhZXMoeCA9IHRpbWUpKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBsb3csIHltYXggPSBoaWdoLCBmaWxsID0gcG9uZF9uYW1lKSkgKyAgIyBBZGp1c3QgZmlsbCBjb2xvcnMKICBnZW9tX2xpbmUoYWVzKHkgPSBtZWQpLCBjb2xvciA9ICJibGFjayIpICsgICMgQmxhY2sgbGluZXMgZm9yIHRoZSBtZWRpYW4gdmFsdWVzCiAgZmFjZXRfd3JhcCh+IHBvbmRfbmFtZSkgKyAgIyBGYWNldCBieSBwb25kX25hbWUKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9tYXBwaW5nKSArICAjIEFwcGx5IGN1c3RvbSBjb2xvciBwYWxldHRlIGZvciByaWJib25zCiAgbGFicygKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gIldhdGVyIFRlbXBlcmF0dXJlICjCsEMpIiwKICAgICAgIGNvbG9yID0gIlBvbmQgTmFtZSIsCiAgICAgICBmaWxsID0gIlBvbmQgTmFtZSIpICsgICMgTGFiZWxzIGZvciBsZWdlbmQKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAxOCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjIpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjUsIGhqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKTW9kZWxFcnJvclBsb3RfWUY4NQoKZ2dzYXZlKCJDb3JyX0Vycm9yX1lGODUucG5nIiwgcGxvdCA9IE1vZGVsRXJyb3JQbG90X1lGODUsIHdpZHRoID0gOSwgaGVpZ2h0ID0gNikKYGBgCgpDbGVhciB0aGUgZW52aXJvbm1lbnQKCmBgYHtyfQpybShsaXN0ID0gbHMoKSkKYGBgCgo=